web-dev-qa-db-fra.com

TabLayout sélection de l'onglet

Comment sélectionner un onglet dans TabLayout par programme?

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

Si vous connaissez l'index de l'onglet que vous souhaitez sélectionner, vous pouvez le faire comme suit:

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

Cette technique fonctionne même si vous utilisez TabLayout seul sans ViewPager (ce qui est atypique et probablement une mauvaise pratique, mais je l'ai déjà vu faire).

376
Firefly

Voici comment je l'ai résolu:

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

Utilisez ceci:

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

Après dans OnClickListener:

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

Utilisez ceci:

tabs.getTabAt(index).select();
26
Riyas PK

C’est probablement pas la solution ultime, et il faut que vous utilisiez la TabLayout avec un ViewPager, mais c’est ainsi que je l’ai résolu. :

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

J'ai testé l'impact de l'utilisation de ce code sur les performances en examinant d'abord les moniteurs de processeur et de mémoire dans Android Studio lors de l'exécution de la méthode, puis en les comparant à la charge imposée au processeur et à la mémoire. quand je navigue moi-même entre les pages (avec des gestes de balayage), et que la différence n'est pas très grande, alors au moins, ce n'est pas une solution horrible ...

J'espère que ça aide quelqu'un!

19
Daniel Kvist

Si vous ne pouvez pas utiliser tab.select () et que vous ne voulez pas utiliser ViewPager, vous pouvez toujours sélectionner un onglet par programme. Si vous utilisez une vue personnalisée via TabLayout.Tab setCustomView(Android.view.View view), c'est plus simple. Voici comment le faire dans les deux sens.

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

Si vous n'utilisez pas de vue personnalisée, vous pouvez le faire comme ceci

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

Utilisez un StateListDrawable pour basculer entre les éléments dessinables sélectionnés et non sélectionnés ou quelque chose de similaire pour faire ce que vous voulez avec des couleurs et/ou des éléments dessinables.

12
kenodoggy

Il suffit de définir viewPager.setCurrentItem(index) et le TabLayout associé sélectionnera l’onglet correspondant.

11
Panduka DeSilva

Vous pouvez essayer de le résoudre avec ceci:

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

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

essaye ça

    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);
6
A.G.THAMAYS

Un peu tard mais pourrait être une solution utile. J'utilise mon TabLayout directement dans mon fragment et j'essaie de sélectionner un onglet assez tôt dans le cycle de vie du fragment. Ce qui a fonctionné pour moi a été d'attendre que TabLayout ait fini de dessiner ses vues enfants en utilisant la méthode Android.view.View#post. c'est à dire:

int myPosition = 0;
myFilterTabLayout.post(() -> { filterTabLayout.getTabAt(myPosition).select(); });
4
ahmed_khan_89

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

// on handler pour éviter un crash hors mémoire

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

Je am utilise TabLayout pour changer de fragment. Cela fonctionne pour la plupart, sauf que, chaque fois que j'essayais de sélectionner un onglet par programme en utilisant tab.select(), mon TabLayout.OnTabSelectedListener déclenchait le onTabSelected(TabLayout.Tab tab), ce qui me causait beaucoup de chagrin. Je cherchais un moyen de faire une sélection programmatique sans déclencher l'auditeur.

J'ai donc adapté la réponse de @kenodoggy à mon utilisation. J'étais en outre confronté à un problème où certains des objets internes renverraient null (parce qu'ils n'étaient pas encore créés, parce que je répondais à onActivityResult() de mon fragment, ce qui se produit avant onCreate() dans le cas où l'activité est singleTask ou singleInstance) alors j’ai écrit une séquence détaillée if/else qui signalerait l’erreur et échouerait sans la NullPointerException qui déclencherait autrement. J'utilise Timber pour la journalisation, si vous n'utilisez pas ce substitut avec 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");
    }
}

Ici, tabLayout est ma variable de mémoire liée à l'objet TabLayout dans mon XML. Et je n'utilise pas la fonction d'onglet de défilement, alors je l'ai également supprimée.

2
Dhiraj Gupta

Par défaut, si vous sélectionnez un onglet, il sera mis en évidence. Si vous voulez sélectionner signifie explicitement utiliser le code commenté donné sous onTabSelected (TabLayout.Tab tab) avec la position d'index de tabulation spécifiée. Ce code explique le changement de fragment sur la position de l'onglet sélectionnée à l'aide de 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);
  }
 }
}
1
anand krish

vous devez utiliser un viewPager pour utiliser 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) {

            }
        });
1
Luis Muñoz

Une solution combinée de différentes réponses est:

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

  myViewPager.setCurrentItem(position, true);

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

S'il se trouve que votre onglet par défaut est le premier (0) et que vous passez à un fragment, vous devez alors le remplacer manuellement pour la première fois. En effet, l'onglet est sélectionné avant que l'écouteur soit enregistré.

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

Vous pouvez également envisager d'appeler getTabAt(0).select() et de remplacer onTabReselected comme suit:

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

Cela fonctionnerait parce que vous remplacez essentiellement le fragment sur chaque onglet resélectionné.

1
farthVader

Si vous avez du mal à comprendre, ce code peut vous aider

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
}

Vous pouvez également ajouter ceci à votre code:

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

Cela peut aider aussi

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

Essayez de cette façon.

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

Vous pouvez définir la position TabLayout en utilisant les fonctions suivantes

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

si vous utilisez TabLayout sans viewPager, cela vous aidera

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

        }
    });
0
Tijo Thomas