Wie soll ich programmgesteuert eine Registerkarte in TabLayout auswählen?
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
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).
So habe ich es gelöst:
void selectPage(int pageIndex){
tabLayout.setScrollPosition(pageIndex,0f,true);
viewPager.setCurrentItem(pageIndex);
}
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();
Benutze das:
tabs.getTabAt(index).select();
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!
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.
Setzen Sie einfach viewPager.setCurrentItem(index)
und das zugehörige TabLayout wählt die entsprechende Registerkarte aus.
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();
}
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);
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(); });
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);
}
});
}
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.
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);
}
}
}
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) {
}
});
Eine kombinierte Lösung aus verschiedenen Antworten ist:
new Handler().postDelayed(() -> {
myViewPager.setCurrentItem(position, true);
myTabLayout.setScrollPosition(position, 0f, true);
},
100);
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.
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));
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) {
}
});
Versuchen Sie es auf diese Weise.
tabLayout.setTabTextColors(getResources().getColor(R.color.colorHintTextLight),
getResources().getColor(R.color.colorPrimaryTextLight));
Sie können die TabLayout-Position mit den folgenden Funktionen einstellen
public void setTab(){
tabLayout.setScrollPosition(YOUR_SCROLL_INDEX,0,true);
tabLayout.setSelected(true);
}
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) {
}
});