Réponses:
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 vu faire).
Voici comment je l'ai résolu:
void selectPage(int pageIndex){
tabLayout.setScrollPosition(pageIndex,0f,true);
viewPager.setCurrentItem(pageIndex);
}
Utilisez ceci:
tabs.getTabAt(index).select();
Objects.requireNonNull(tabs.getTabAt(position)).select();
sûr à utiliser
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();
Ce n'est probablement pas la solution ultime , et cela nécessite que vous utilisiez le TabLayout
avec unViewPager
, mais voici comment je l'ai résolu:
void selectPage(int pageIndex)
{
viewPager.setCurrentItem(pageIndex);
tabLayout.setupWithViewPager(viewPager);
}
J'ai testé l'ampleur de l'impact sur les performances de l'utilisation de ce code en examinant d'abord les moniteurs de CPU et de mémoire dans Android Studio lors de l'exécution de la méthode, puis en les comparant à la charge qui a été placée sur le CPU et la mémoire lorsque j'ai navigué entre les pages. moi-même (en utilisant des gestes de balayage), et la différence n'est pas significativement grande, donc au moins ce n'est pas une solution horrible ...
J'espère que cela aide quelqu'un!
tabLayout.setScrollPosition(pageIndex,0f,true);
), quand j'ai cliqué sur l'onglet à droite, cela n'a pas mis à jour la page de ViewPager (je ne sais pas pourquoi). Un simple clic sur l'onglet de gauche puis sur l'onglet de droite mettrait enfin à jour la page pour avoir la page de l'onglet de droite, ce qui est très glitch. Mais cette solution n'a eu aucun problème.
Si vous ne pouvez pas utiliser tab.select () et que vous ne souhaitez pas utiliser un ViewPager, vous pouvez toujours sélectionner un onglet par programme. Si vous utilisez une vue personnalisée, TabLayout.Tab setCustomView(android.view.View view)
c'est plus simple. Voici comment procéder 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 une 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 dessinables sélectionnés et non sélectionnés ou quelque chose de similaire pour faire ce que vous voulez avec les couleurs et / ou les dessinables.
Il suffit de définir viewPager.setCurrentItem(index)
et le TabLayout associé sélectionnerait l'onglet respectif.
Un peu en retard mais pourrait être une solution utile. J'utilise ma 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, c'est d'attendre que TabLayout ait fini de dessiner ses vues enfant en utilisant la android.view.View#post
méthode. c'est à dire:
int myPosition = 0;
myFilterTabLayout.post(() -> { filterTabLayout.getTabAt(myPosition).select(); });
new Handler().postDelayed(()->{ tabLayout.post(() -> { tabLayout.getTabAt(myPosition).select(); }); },200);
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);
Je suis utilise TabLayout pour passer des fragments. Cela fonctionne pour la plupart, sauf lorsque j'essaie de sélectionner un onglet par programmation tab.select()
, mon TabLayout.OnTabSelectedListener
déclenche laonTabSelected(TabLayout.Tab tab)
, ce qui me causerait 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 retourneraient nuls (car ils n'étaient pas encore créés, parce que je répondais à onActivityResult()
partir de mon fragment, ce qui se produit avant onCreate()
dans le cas où l'activité est singleTask
ou singleInstance
) alors j'ai rédigé un détail si / else séquence qui signalerait l'erreur et NullPointerException
passerait sans que cela ne se déclenche 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' TabLayout
objet dans mon XML. Et je n'utilise pas la fonction d'onglet de défilement, j'ai donc supprimé cela également.
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) {
}
});
ajouter pour votre viseur:
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) {
}
});
// sur le gestionnaire pour éviter les pannes hors de la mémoire
private void setViewPagerByIndex(final int index){
Application.getInstance().getHandler().post(new Runnable() {
@Override
public void run() {
viewPager.setCurrentItem(index);
}
});
}
Avec le TabLayout
fourni par la bibliothèque de composants de matériaux utilisez simplement la selectTab
méthode:
TabLayout tabLayout = findViewById(R.id.tab_layout);
tabLayout.selectTab(tabLayout.getTabAt(index));
Il nécessite la version 1.1.0.
Par défaut, si vous sélectionnez un onglet, il sera mis en surbrillance. Si vous souhaitez sélectionner Explicitement signifie utiliser le code commenté donné sous onTabSelected (onglet TabLayout.Tab) avec votre position d'index d'onglet spécifiée. Ce code explique le changement de fragment sur la position sélectionnée de l'onglet à l'aide du 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);
}
}
}
Cela peut aussi aider
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) {
}
});
S'il se trouve que votre onglet par défaut est le premier (0) et que vous passez à un fragment, vous devez remplacer manuellement le fragment pour la première fois. En effet, l'onglet est sélectionné avant que l'auditeur ne 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;
}
Alternativement, vous pouvez envisager d'appeler getTabAt(0).select()
et de remplacer onTabReselected
comme ceci:
@Override
public void onTabReselected(TabLayout.Tab tab) {
// Replace the corresponding tab fragment.
}
Cela fonctionnerait car vous remplacez essentiellement le fragment à chaque nouvelle sélection d'onglet.
Vous pouvez définir la position de TabLayout à l'aide des fonctions suivantes
public void setTab(){
tabLayout.setScrollPosition(YOUR_SCROLL_INDEX,0,true);
tabLayout.setSelected(true);
}
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));
Essayez de cette façon.
tabLayout.setTabTextColors(getResources().getColor(R.color.colorHintTextLight),
getResources().getColor(R.color.colorPrimaryTextLight));
si vous utilisez TabLayout sans viewPager cela aide
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) {
}
});
Correction de Kotlin
viewPager.currentItem = 0
tabs.setupWithViewPager (viewPager)
TabLayout jobTabs = v.findViewById(R.id.jobTabs);
ViewPager jobFrame = v.findViewById(R.id.jobPager);
jobFrame.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(jobTabs));
cela sélectionnera l'onglet comme page de balayage du téléavertisseur
TabLayout.Tab.select()
: "Sélectionnez cet onglet. Valide uniquement si l'onglet a été ajouté à la barre d'actions."