TabLayout选项卡select

如何以编程方式selectTabLayout中的选项卡?

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

如果您知道要select的选项卡的索引,可以这样做:

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

即使你自己使用TabLayout而没有ViewPager(这是非典型的,可能是坏习惯,但是我已经看到它完成了),这种技术也可以工作。

这是我解决它的方法:

 void selectPage(int pageIndex){ tabLayout.setScrollPosition(pageIndex,0f,true); viewPager.setCurrentItem(pageIndex); } 

这可能不是最终的解决scheme它需要您将TabLayoutTabLayout一起使用 ,但这是我解决它的方法:

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

我testing了使用此代码的性能影响有多大,首先查看Android Studio中的CPU和内存监视器,同时运行该方法,然后将其与在页面之间导航时放置在CPU和内存上的负载进行比较我自己(使用滑动手势),差异不是很大,所以至less不是一个可怕的解决scheme…

希望这可以帮助别人!

如果您不能使用tab.select()并且不想使用ViewPager,则仍然可以通过编程方式select一个选项卡。 如果您通过TabLayout.Tab setCustomView(android.view.View view)使用自定义视图, TabLayout.Tab setCustomView(android.view.View view)简单。 以下是如何做到这一点。

 // 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 } 

如果你不使用自定义视图,那么你可以这样做

 // 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 } 

使用StateListDrawable在已select和未select的可绘制物体之间进行切换,或使用颜色和/或可绘制物体进行类似的操作。

使用tabs.getTabAt(2).select();

用这个:

 <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"/> 

在OnClickListener之后:

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

尝试这个

  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); 

只需设置viewPager.setCurrentItem(index) ,关联的TabLayout将select相应的选项卡。

为您的viewpager添加:

  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) { } }); 

/ /在处理程序,以防止崩溃outofmemory

 private void setViewPagerByIndex(final int index){ Application.getInstance().getHandler().post(new Runnable() { @Override public void run() { viewPager.setCurrentItem(index); } }); } 

你可以试着解决这个问题:

 TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); tabLayout.setupWithViewPager(mViewPager); TabLayout.Tab tab = tabLayout.getTabAt(pos); if (tab != null) { tab.select(); } 

默认情况下,如果你select一个标签,它将被突出显示。 如果你想select明确的意思是使用onTabSelected(TabLayout.Tab标签)下给定的注释代码与你指定的标签索引位置。 这段代码将使用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); } } } 

正在使用TabLayout切换片段。 它大部分工作,除非我试图用tab.select()以编程方式select一个选项卡,我的TabLayout.OnTabSelectedListener会触发onTabSelected(TabLayout.Tab tab) ,这将导致我非常悲伤。 我正在寻找一种方法来做select而不触发监听器。

所以我改编了@kenodoggy的答案。 我进一步面临一些问题,其中一些内部对象将返回null(因为他们还没有创build,因为我是从我的片段回答onActivityResult() ,这是在activity为singleTasksingleInstance的情况下发生在onCreate()之前),所以我写了一个详细的if / else序列来报告错误,并通过没有NullPointerException否则会触发。 我使用木材进行日志logging,如果您不使用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"); } } 

在这里,tabLayout是绑定到我的XML中的TabLayout对象的内存variables。 而且我不使用滚动标签function,所以我也删除了这个function。

这也可以帮助

 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) { } });