webentwicklung-frage-antwort-db.com.de

Auswahl der Registerkarte "TabLayout"

Wie soll ich programmgesteuert eine Registerkarte in TabLayout auswählen?

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

Wenn Sie den Index der Registerkarte kennen, die Sie auswählen möchten, können Sie dies folgendermaßen tun:

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

Diese Technik funktioniert auch, wenn Sie das TabLayout alleine ohne ViewPager verwenden (das ist untypisch und wahrscheinlich eine schlechte Übung, aber ich habe es gesehen).

376
Firefly

So habe ich es gelöst:

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

Benutze das:

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

Nach in OnClickListener:

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

Benutze das:

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

Dies ist wahrscheinlich nicht die ultimative Lösung und es erfordert, dass Sie TabLayout zusammen mit ViewPager verwenden, aber so habe ich es gelöst :

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

Ich habe getestet, wie stark sich die Verwendung dieses Codes auf die Leistung auswirkt, indem ich zuerst die CPU- und Speichermonitore in Android Studio betrachtete, während die Methode ausgeführt wurde, und sie dann mit der Last verglichen habe, die auf die CPU und den Speicher angewendet wurde Wenn ich selbst zwischen den Seiten navigiert habe (mit Wischgesten) und der Unterschied nicht signifikant groß ist, ist es zumindest keine schreckliche Lösung ...

Hoffe das hilft jemandem!

19
Daniel Kvist

Wenn Sie tab.select () nicht verwenden können und keinen ViewPager verwenden möchten, können Sie trotzdem programmgesteuert eine Registerkarte auswählen. Wenn Sie eine benutzerdefinierte Ansicht über TabLayout.Tab setCustomView(Android.view.View view) verwenden, ist dies einfacher. Hier ist, wie es in beide Richtungen geht.

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

Wenn Sie keine benutzerdefinierte Ansicht verwenden, können Sie dies folgendermaßen tun

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

Verwenden Sie StateListDrawable, um zwischen ausgewählten und nicht ausgewählten Zeichenobjekten umzuschalten, oder ähnliches, um mit Farben und/oder Zeichenobjekten das zu tun, was Sie wollen.

12
kenodoggy

Setzen Sie einfach viewPager.setCurrentItem(index) und das zugehörige TabLayout wählt die entsprechende Registerkarte aus.

11
Panduka DeSilva

Sie können versuchen, es mit diesem zu lösen:

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

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

versuche dies

    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

Ein bisschen zu spät, könnte aber eine nützliche Lösung sein. Ich verwende mein TabLayout direkt in meinem Fragment und versuche ziemlich früh im Lebenszyklus des Fragments, einen Tab auszuwählen. Was für mich funktionierte, war zu warten, bis das TabLayout das Zeichnen seiner untergeordneten Ansichten mit der Android.view.View#post -Methode beendet hat. d.h.

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

für deinen viewpager hinzufügen:

 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, um einen Absturz außerhalb des Speichers zu verhindern

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

Ich bin mit TabLayout, um Fragmente zu wechseln. Es funktioniert größtenteils, außer wenn ich versucht habe, einen Tab mit tab.select() programmgesteuert auszuwählen, hat mein TabLayout.OnTabSelectedListener die onTabSelected(TabLayout.Tab tab) ausgelöst, was mir viel Kummer bereitet. Ich suchte nach einer Möglichkeit, eine programmatische Auswahl zu treffen, ohne den Hörer auszulösen.

Also habe ich die Antwort von @kenodoggy an meine Verwendung angepasst. Ich hatte außerdem ein Problem, bei dem einige der internen Objekte null zurückgaben (weil sie noch nicht erstellt wurden, weil ich onActivityResult() von meinem Fragment aus beantwortete, das bei der Aktivität vor onCreate() auftritt ist singleTask oder singleInstance) also habe ich eine detaillierte if/else-Sequenz geschrieben, die den Fehler meldet und ohne das NullPointerException durchfällt, das andernfalls ausgelöst würde. Ich verwende Timber für die Protokollierung, wenn Sie diesen Ersatz nicht mit Log.e() verwenden.

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

Hier ist tabLayout meine Speichervariable, die an das Objekt TabLayout in meinem XML gebunden ist. Und ich benutze die Bildlauf-Tab-Funktion nicht, also habe ich sie auch entfernt.

2
Dhiraj Gupta

Wenn Sie eine Registerkarte auswählen, wird diese standardmäßig hervorgehoben. Wenn Sie Explizit auswählen möchten, verwenden Sie den angegebenen kommentierten Code unter onTabSelected (Registerkarte TabLayout.Tab) mit der angegebenen Indexposition für die Registerkarte. In diesem Code wird erläutert, wie Sie das Fragment auf der Registerkarte ändern, die mit dem Viewpager ausgewählt wurde.

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

sie sollten einen viewPager verwenden, um viewPager.setCurrentItem () zu verwenden.

 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

Eine kombinierte Lösung aus verschiedenen Antworten ist:

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

  myViewPager.setCurrentItem(position, true);

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

Wenn dies der Fall ist und Sie zu einem Fragment wechseln, müssen Sie das Fragment zum ersten Mal manuell ersetzen. Dies liegt daran, dass die Registerkarte ausgewählt wird, bevor der Listener registriert wird.

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

Alternativ können Sie getTabAt(0).select() aufrufen und onTabReselected wie folgt überschreiben:

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

Dies würde funktionieren, da Sie im Wesentlichen das Fragment auf jeder Registerkarte neu auswählen.

1
farthVader

Wenn Sie Probleme mit dem Verständnis haben, kann Ihnen dieser Code helfen

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
}

Sie können dies auch zu Ihrem Code hinzufügen:

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

Das kann auch helfen

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

Versuchen Sie es auf diese Weise.

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

Sie können die TabLayout-Position mit den folgenden Funktionen einstellen

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

wenn Sie TabLayout ohne viewPager verwenden, hilft dies

 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