Pilihan tab TabLayout

Jawaban:

418

Jika Anda tahu indeks tab yang ingin Anda pilih, Anda dapat melakukannya seperti:

TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
TabLayout.Tab tab = tabLayout.getTabAt(someIndex);
tab.select();

Teknik ini berfungsi bahkan jika Anda menggunakan TabLayout dengan sendirinya tanpa ViewPager (yang tidak lazim, dan mungkin praktik yang buruk, tetapi saya telah melihatnya selesai).

Firefly
sumber
10
Solusi ini hanya berfungsi jika tab telah ditambahkan ke panel tindakan, yang mungkin tidak selalu menjadi kasus. Dari dokumentasi untuk TabLayout.Tab.select(): "Pilih tab ini. Hanya valid jika tab telah ditambahkan ke panel tindakan."
Daniel Kvist
7
@DanielKvist, sebenarnya dokumentasi itu sendiri salah. Kode sumber berbicara sendiri. Jawaban ini harus menjadi jawaban yang diterima.
Jason Sparc
@JasonSparc Hmm, saya ingat itu tidak bekerja untuk saya ketika saya terakhir mencoba solusi ini, tetapi saya akan melihat apakah saya dapat memeriksa periksa bagaimana cara kerjanya untuk saya. Sudahkah Anda mencoba? Mungkin berfungsi dalam beberapa kasus, sementara tidak dalam kasus lain? Mungkin tergantung pada tingkat API atau yang serupa?
Daniel Kvist
Terima kasih telah membersihkan udara dengan jawaban yang setengah matang! Karena itu tidak berfungsi pada TabLayout mandiri mungkin karena alasan yang Anda nyatakan; Ini dimaksudkan untuk bekerja dengan Tab di Actionbar!
sud007
3
Mengapa menggunakan TabLayout tanpa ViewPager harus dianggap sebagai praktik yang buruk?
tomalf2
85

Inilah cara saya menyelesaikannya:

void selectPage(int pageIndex){
    tabLayout.setScrollPosition(pageIndex,0f,true);
    viewPager.setCurrentItem(pageIndex);
}
sial
sumber
3
Jawaban yang dipilih tidak berhasil untuk saya, tetapi jawaban ini berhasil.
Rafal Zawadzki
solusi hebat! bekerja dengan baik untuk saya, ketika saya harus kembali ke halaman pertama viewPager dan TabView
sashk0
49

Gunakan ini:

tabs.getTabAt(index).select();
Riyas PK
sumber
terima kasih, ini solusi aman untuk implementasi saya
islam farid
Objects.requireNonNull(tabs.getTabAt(position)).select();aman digunakan
Williaan Lopes
1
Perlu diingat bahwa, jika currentTabIndex dan indeks sama, ini akan mengirimkan aliran Anda ke onTabReleksi dan bukan padaTelelPilih.
Abhishek Kumar
@ WilliaanLopes, ini tidak akan melindungi Anda dari NPI, hanya akan membuangnya lebih cepat
Krzysztof Kubicki
33

Gunakan ini:

<android.support.design.widget.TabLayout
    android:id="@+id/patienthomescreen_tabs"
    android:layout_width="match_parent"
    android:layout_height="72sp"
    app:tabGravity="fill"
    app:tabMode="fixed"
    app:tabIndicatorColor="@android:color/white"
    app:tabSelectedTextColor="@color/green"/>

Setelah di OnClickListener:

TabLayout tabLayout = (TabLayout) findViewById(R.id.patienthomescreen_tabs);
TabLayout.Tab tab = tabLayout.getTabAt(someIndex);
tab.select();
Pravin Suthar
sumber
bagaimana jika tabMode dapat digulir?
GvSharma
Saya kira sama, silakan Anda coba dulu.
Pravin Suthar
23

Ini mungkin bukan solusi akhir , dan itu mengharuskan Anda menggunakan TabLayoutbersama - sama denganViewPager , tetapi ini adalah bagaimana saya menyelesaikannya:

void selectPage(int pageIndex)
{
    viewPager.setCurrentItem(pageIndex);
    tabLayout.setupWithViewPager(viewPager);
}

Saya menguji seberapa besar dampak kinerja dari penggunaan kode ini dengan pertama-tama melihat CPU- dan monitor memori di Android Studio sambil menjalankan metode ini, kemudian membandingkannya dengan beban yang diletakkan pada CPU dan memori ketika saya menavigasi antar halaman. sendiri (menggunakan gerakan gesek), dan perbedaannya tidak terlalu besar, jadi setidaknya itu bukan solusi yang mengerikan ...

Semoga ini bisa membantu seseorang!

Daniel Kvist
sumber
1
Ketika saya melakukan solusi dap ( tabLayout.setScrollPosition(pageIndex,0f,true);), ketika saya mengklik tab di sebelah kanan, itu tidak memperbarui halaman ViewPager (saya tidak tahu mengapa). Hanya dengan mengklik kembali pada tab kiri & kemudian pada tab kanan lagi akhirnya akan memperbarui halaman untuk memiliki halaman tab kanan, yang sangat glitchy. Tetapi solusi ini tidak memiliki gangguan.
Rock Lee
12

Jika Anda tidak dapat menggunakan tab.select () dan Anda tidak ingin menggunakan ViewPager, Anda masih dapat memilih tab secara terprogram. Jika Anda menggunakan tampilan khusus melalui TabLayout.Tab setCustomView(android.view.View view)itu lebih sederhana. Inilah cara melakukannya dengan dua cara.

// if you've set a custom view
void updateTabSelection(int position) {
    // get the position of the currently selected tab and set selected to false
    mTabLayout.getTabAt(mTabLayout.getSelectedTabPosition()).getCustomView().setSelected(false);
    // set selected to true on the desired tab
    mTabLayout.getTabAt(position).getCustomView().setSelected(true);
    // move the selection indicator
    mTabLayout.setScrollPosition(position, 0, true);

    // ... your logic to swap out your fragments
}

Jika Anda tidak menggunakan tampilan khusus maka Anda dapat melakukannya seperti ini

// if you are not using a custom view
void updateTabSelection(int position) {
    // get a reference to the tabs container view
    LinearLayout ll = (LinearLayout) mTabLayout.getChildAt(0);
    // get the child view at the position of the currently selected tab and set selected to false
    ll.getChildAt(mTabLayout.getSelectedTabPosition()).setSelected(false);
    // get the child view at the new selected position and set selected to true
    ll.getChildAt(position).setSelected(true);
    // move the selection indicator
    mTabLayout.setScrollPosition(position, 0, true);

    // ... your logic to swap out your fragments
}

Gunakan StateListDrawable untuk beralih antara drawables yang dipilih dan yang tidak dipilih atau yang serupa untuk melakukan apa yang Anda inginkan dengan warna dan / atau drawables.

kenodoggi
sumber
12

Cukup atur viewPager.setCurrentItem(index)dan TabLayout terkait akan memilih tab masing-masing.

Panduka DeSilva
sumber
Ini tidak berhasil untuk saya. Saya harus menggunakan metode .post.
arenaq
7

Anda dapat mencoba menyelesaikannya dengan ini:

TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(mViewPager);

TabLayout.Tab tab = tabLayout.getTabAt(pos);
if (tab != null) {
    tab.select();
}
CoCo Dev
sumber
5

coba ini

    new Handler().postDelayed(
            new Runnable(){
                @Override
                public void run() {
                    if (i == 1){
                        tabLayout.getTabAt(0).select();
                    } else if (i == 2){
                        tabLayout.getTabAt(1).select();
                    }
                }
            }, 100);
AGTHAMAYS
sumber
Terima kasih. Itu berhasil untuk saya. Tetapi apakah itu praktik yang baik untuk menggunakan tertunda?
Harsh Shah
Saya kira itu buruk untuk menjalankan utas pada salah satu penyebab tata letak jika seandainya Anda mengambil teks untuk tab dari server backend dan jika ada alasan server tertunda maka utas sistem ini akan secara tidak sengaja menghabiskan sumber daya perangkat Anda.
cammando
solusi sangat jelek
Lester
Ini tidak berhasil untuk saya. Bagaimana cara saya membuatnya jika pengguna mengklik sebuah tab, kemudian menunda pemilihan tab itu? Saya tidak bisa mendapatkan apa pun untuk bekerja. Saya mencoba sebagai gantinya jika saya == 1 menggunakan (mViewPager.getCurrentItem () == 0) tetapi tidak berfungsi dan tidak melakukan hal lain.
iBEK
5

Agak terlambat tapi mungkin solusi yang bermanfaat. Saya menggunakan TabLayout saya langsung di Fragmen saya dan mencoba untuk memilih tab cukup awal dalam Siklus Hidup Fragmen. Apa yang berhasil bagi saya adalah menunggu sampai TabLayout selesai menggambar pandangan anaknya dengan menggunakan android.view.View#postmetode. yaitu:

int myPosition = 0;
myFilterTabLayout.post(() -> { filterTabLayout.getTabAt(myPosition).select(); });
ahmed_khan_89
sumber
jawaban yang benar bekerja untuk saya tetapi penundaan akan memberikan efek yang bagus new Handler().postDelayed(()->{ tabLayout.post(() -> { tabLayout.getTabAt(myPosition).select(); }); },200);
Hisham
3

Saya sedang menggunakan TabLayout untuk beralih fragmen. Ini berfungsi sebagian besar, kecuali setiap kali saya mencoba memilih tab menggunakan program tab.select(), saya TabLayout.OnTabSelectedListenerakan memicu onTabSelected(TabLayout.Tab tab), yang akan menyebabkan saya banyak kesedihan. Saya mencari cara untuk melakukan seleksi terprogram tanpa memicu pendengar.

Jadi saya mengadaptasi jawaban @kenodoggy untuk saya gunakan. Saya selanjutnya menghadapi masalah di mana beberapa objek internal akan mengembalikan nol (karena mereka belum dibuat, karena saya menjawab onActivityResult()dari fragmen saya, yang terjadi sebelum onCreate()dalam kasus aktivitas singleTaskatau singleInstance) jadi saya menulis detail jika / / Urutan lain yang akan melaporkan kesalahan dan gagal tanpa NullPointerExceptionyang sebaliknya akan memicu. Saya menggunakan Kayu untuk logging, jika Anda tidak menggunakan pengganti dengan Log.e().

void updateSelectedTabTo(int position) {
    if (tabLayout != null){
        int selected = tabLayout.getSelectedTabPosition();
        if (selected != -1){
            TabLayout.Tab oldTab = tabLayout.getTabAt(0);
            if (oldTab != null){
                View view = oldTab.getCustomView();
                if (view != null){
                    view.setSelected(false);
                }
                else {
                    Timber.e("oldTab customView is null");
                }
            }
            else {
                Timber.e("oldTab is null");
            }
        }
        else {
            Timber.e("selected is -1");
        }
        TabLayout.Tab newTab = tabLayout.getTabAt(position);
        if (newTab != null){
            View view = newTab.getCustomView();
            if (view != null){
                view.setSelected(false);
            }
            else {
                Timber.e("newTab customView is null");
            }
        }
        else {
            Timber.e("newTab is null");
        }
    }
    else {
        Timber.e("tablayout is null");
    }
}

Di sini, tabLayout adalah variabel memori saya terikat ke TabLayoutobjek di XML saya. Dan saya tidak menggunakan fitur tab gulir jadi saya menghapusnya juga.

Dhiraj Gupta
sumber
3

Anda harus menggunakan viewPager untuk menggunakan viewPager.setCurrentItem ()

 viewPager.setCurrentItem(n);
 tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });
Luis Muñoz
sumber
2

tambahkan untuk viewpager Anda:

 viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageSelected(int position) {
                array.clear();
                switch (position) {
                    case 1:
                        //like a example
                        setViewPagerByIndex(0);
                        break;
                }
            }

            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }

            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });

// pada penangan untuk mencegah kerusakan karena memori

private void setViewPagerByIndex(final int index){
    Application.getInstance().getHandler().post(new Runnable() {
        @Override
        public void run() {
            viewPager.setCurrentItem(index);
        }
    });
}
Alex Zaraos
sumber
1
"cegah crash outofmemory" - mengapa kita perlu utas terpisah untuk memilih item saat ini?
AppiDevo
2

Solusi gabungan dari jawaban yang berbeda adalah:

new Handler().postDelayed(() -> {

  myViewPager.setCurrentItem(position, true);

  myTabLayout.setScrollPosition(position, 0f, true);
},
100);
Zon
sumber
2

Dengan TabLayoutdisediakan oleh Perpustakaan Komponen Bahan hanya menggunakan selectTabmetode:

TabLayout tabLayout = findViewById(R.id.tab_layout);
tabLayout.selectTab(tabLayout.getTabAt(index));

masukkan deskripsi gambar di sini

Itu membutuhkan versi 1.1.0.

Gabriele Mariotti
sumber
Tidak, selectTab adalah metode paket-pribadi.
XY
@ xyuber.com Saya menambahkan info penting. Itu membutuhkan versi 1.1.0. Metode ini sekarang untuk umum
Gabriele Mariotti
1

Secara default jika Anda memilih tab itu akan disorot. Jika Anda ingin memilih secara eksplisit berarti menggunakan kode komentar yang diberikan di bawah onTabSelected (TabLayout.Tab tab) dengan posisi indeks tab yang ditentukan. Kode ini akan menjelaskan tentang perubahan fragmen pada posisi yang dipilih tab menggunakan viewpager.

public class GalleryFragment extends Fragment implements TabLayout.OnTabSelectedListener 
{
private ViewPager viewPager;public ViewPagerAdapter adapter;private TabLayout tabLayout;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_gallery, container, false);
viewPager = (ViewPager) rootView.findViewById(R.id.viewpager);
adapter = new ViewPagerAdapter(getChildFragmentManager());
adapter.addFragment(new PaymentCardFragment(), "PAYMENT CARDS");
adapter.addFragment(new LoyaltyCardFragment(), "LOYALTY CARDS");
viewPager.setAdapter(adapter);
tabLayout = (TabLayout) rootView.findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);
    tabLayout.setOnTabSelectedListener(this);
}

@Override
public void onTabSelected(TabLayout.Tab tab) {
    //This will be called 2nd when you select a tab or swipe using viewpager
    final int position = tab.getPosition();
    Log.i("card", "Tablayout pos: " + position);
    //TabLayout.Tab tabdata=tabLayout.getTabAt(position);
    //tabdata.select();
    tabLayout.post(new Runnable() {
        @Override
        public void run() {
            if (position == 0) {
                PaymentCardFragment paymentCardFragment = getPaymentCardFragment();
                if (paymentCardFragment != null) {
                   VerticalViewpager vp = paymentCardFragment.mypager;
                    if(vp!=null)
                    {
                      //vp.setCurrentItem(position,true);
                      vp.setCurrentItem(vp.getAdapter().getCount()-1,true);
                    }
                  }
            }
            if (position == 1) {
               LoyaltyCardFragment loyaltyCardFragment = getLoyaltyCardFragment();
                if (loyaltyCardFragment != null) {
                   VerticalViewpager vp = loyaltyCardFragment.mypager;
                    if(vp!=null)
                    {
                        vp.setCurrentItem(position);
                    }
                  }
            }
        }
    });
}

@Override
public void onTabUnselected(TabLayout.Tab tab) {
 //This will be called 1st when you select a tab or swipe using viewpager
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
  //This will be called only when you select the already selected tab(Ex: selecting 3rd tab again and again)
}
 private PaymentCardFragment getLoyaltyCardFragment() {
    Fragment f = adapter.mFragmentList.get(viewPager.getCurrentItem());

   if(f instanceof PaymentCardFragment)
   {
    return (PaymentCardFragment) f;
   }
   return null;
 }
private LoyaltyCardFragment getPaymentCardFragment() {
    Fragment f = adapter.mFragmentList.get(viewPager.getCurrentItem());
    if(f instanceof LoyaltyCardFragment)
   {
    return (LoyaltyCardFragment) f;
   }
   return null;
 }
  class ViewPagerAdapter extends FragmentPagerAdapter {
   public List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();
   public void addFragment(Fragment fragment, String title) {
   mFragmentList.add(fragment);
   mFragmentTitleList.add(title);
  }
 }
}
anand krish
sumber
1

Ini juga bisa membantu

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int i, float v, int i1) {
    }

    @Override
    public void onPageSelected(int i) {
        tablayout.getTabAt(i).select();
    }

    @Override
    public void onPageScrollStateChanged(int i) {
    }
});
Hadi Note
sumber
1

Jika kebetulan bahwa tab default Anda adalah yang pertama (0) dan Anda kebetulan beralih ke fragmen, maka Anda harus secara manual mengganti fragmen untuk pertama kalinya. Ini karena tab dipilih sebelum pendengar terdaftar.

private TabLayout mTabLayout;

...

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_tablayout, container, false);
    mTabLayout = view.findViewById(R.id.sliding_tabs);
    mTabLayout.addOnTabSelectedListener(mOnTabSelectedListener);

    getActivity().getSupportFragmentManager().beginTransaction()
        .replace(R.id.tabContent, MyFirstFragment.newInstance()).commit();
    return view;
}

Atau, Anda dapat mempertimbangkan menelepon getTabAt(0).select()dan mengganti onTabReselectedseperti:

@Override
public void onTabReselected(TabLayout.Tab tab) {
    // Replace the corresponding tab fragment.
}

Ini akan berhasil karena Anda pada dasarnya mengganti fragmen pada setiap tab pilih kembali.

farthVader
sumber
0

Anda dapat mengatur posisi TabLayout menggunakan fungsi berikut

public void setTab(){
 tabLayout.setScrollPosition(YOUR_SCROLL_INDEX,0,true);
 tabLayout.setSelected(true);
}
Dhruv Narayan Singh
sumber
0

Jika Anda kesulitan memahami, kode ini dapat membantu Anda

private void MyTabLayout(){
    TabLayout.Tab myTab = myTabLayout.newTab(); // create a new tab
    myTabLayout.addTab(myTab); // add my new tab to myTabLayout
    myTab.setText("new tab"); 
    myTab.select(); // select the new tab
}

Anda juga dapat menambahkan ini ke kode Anda:

myTabLayout.setTabTextColors(getColor(R.color.colorNormalTab),getColor(R.color.colorSelectedTab));
M3TALzero1
sumber
0

Coba dengan cara ini.

tabLayout.setTabTextColors(getResources().getColor(R.color.colorHintTextLight),
                           getResources().getColor(R.color.colorPrimaryTextLight));
Anandharaj R
sumber
0

jika Anda menggunakan TabLayout tanpa viewPager, ini membantu

 mTitles = getResources().getStringArray(R.array.tabItems);
    mIcons = getResources().obtainTypedArray(R.array.tabIcons);
    for (int i = 0; i < mTitles.length; i++) {

        tabs.addTab(tabs.newTab().setText(mTitles[i]).setIcon(mIcons.getDrawable(i)));
        if (i == 0) {
            /*For setting selected position 0 at start*/
            Objects.requireNonNull(Objects.requireNonNull(tabs.getTabAt(i)).getIcon()).setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimary), PorterDuff.Mode.SRC_IN);
        }
    }

    tabs.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            Objects.requireNonNull(tab.getIcon()).setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimary), PorterDuff.Mode.SRC_IN);
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
            Objects.requireNonNull(tab.getIcon()).setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.white), PorterDuff.Mode.SRC_IN);
        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
Tijo Thomas
sumber
0

Memperbaiki Kotlin

viewPager.currentItem = 0

tabs.setupWithViewPager (viewPager)

Juan Ocampo
sumber
0
TabLayout jobTabs = v.findViewById(R.id.jobTabs);
ViewPager jobFrame = v.findViewById(R.id.jobPager);
jobFrame.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(jobTabs));

ini akan memilih tab sebagai tampilan halaman geser halaman

Rachit Vohera
sumber