Sekme Düzeni sekmesi seçimi


Yanıtlar:


418

Seçmek istediğiniz sekmenin dizinini biliyorsanız, bunu şu şekilde yapabilirsiniz:

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

TabLayout'u bir ViewPager olmadan (hatta atipik ve muhtemelen kötü bir uygulamadır, ancak yapıldığını gördüm) kullansanız bile bu teknik çalışır.


10
Bu çözüm yalnızca sekme eylem çubuğuna eklenmişse işe yarar; bu durum her zaman böyle olmayabilir. Belgelerine Gönderen TabLayout.Tab.select(): "Bu sekmeyi seçin Yalnızca geçerli sekme işlem çubuğuna eklenmiş eğer.."
Daniel Kvist

7
@DanielKvist, aslında belgelerin kendisi yanlış. Kaynak kodu kendisi için konuşur. Bu cevap kabul edilen cevap olmalıdır.
Jason Sparc

@JasonSparc Hmm, bu çözümü en son denediğimde benim için çalışmadığını hatırlıyorum, ama benim için nasıl çalıştığını iki kez kontrol edip edemeyeceğimi göreceğim. Denedin mi? Bazı durumlarda işe yarayabilirken, diğer durumlarda işe yaramayabilir mi? API düzeyine veya benzeri bir şeye bağlı olabilir mi?
Daniel Kvist

Yarı pişmiş cevaplarda Havayı temizlediğiniz için teşekkürler! Çünkü bu, muhtemelen belirttiğiniz nedenden dolayı tek başına TabLayout'ta çalışmaz; Actionbar'daki Sekmelerle çalışmak içindir!
sud007

3
Neden TabLayout'u ViewPager olmadan kullanmak kötü bir uygulama olarak değerlendirilmelidir?
tomalf2

85

Ben böyle çözdüm:

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

3
Seçilen cevap benim için işe yaramadı, ama bu cevap verdi.
Rafal Zawadzki

harika bir çözüm! ilk sayfaya geri dönmem gerektiğinde benim için iyi çalıştı, hem viewPager hem de TabView
sashk0

49

Bunu kullan:

tabs.getTabAt(index).select();

teşekkürler, bu benim uygulamada olduğu gibi güvenli bir çözüm
islam farid

Objects.requireNonNull(tabs.getTabAt(position)).select();güvenli
Williaan Lopes

1
CurrentTabIndex ve index aynı ise, akışınızı onTabSelected'a değil onTabReselected'a gönderir.
Abhishek Kumar

@WilliaanLopes, bu sizi NPI'den korumayacak, daha erken atacak
Krzysztof Kubicki

33

Bunu kullan:

<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'da sonra:

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

tabMode kaydırılabilirse ne olur?
GvSharma

Sanırım aynı, lütfen önce bunu dene.
Pravin Suthar

23

Bu muhtemelen nihai çözüm değildir ve bunu kullanmanızı gerektirir TabLayoutbir ile buluşmanızıViewPager , ama bunu nasıl çözdüğünü şudur:

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

Bu kodu kullanmanın performans etkisinin, yöntemi çalıştırırken önce Android Studio'daki CPU ve bellek monitörlerine bakarak ne kadar büyük olduğunu test ettikten sonra, sayfalar arasında dolaştığımda CPU ve belleğe yüklenen yük ile karşılaştırarak (kaydırma hareketlerini kullanarak) ve fark önemli ölçüde büyük değil, bu yüzden en azından korkunç bir çözüm değil ...

Umarım bu birine yardımcı olur!


1
Dap çözümünü ( tabLayout.setScrollPosition(pageIndex,0f,true);) yaptığımda, sağdaki sekmeye tıkladığımda, ViewPager'in sayfasını güncellemedi (nedenini bilmiyorum). Yalnızca sol sekmeyi ve ardından sağ sekmeyi tekrar tıklamak, sayfayı son derece sağa doğru sekmenin sayfası olacak şekilde güncelleyecektir. Ancak bu çözümde aksaklık yoktu.
Rock Lee

12

Tab.select () yöntemini kullanamıyorsanız ve bir ViewPager kullanmak istemiyorsanız, yine de programlı olarak bir sekme seçebilirsiniz. Üzerinden özel bir görünüm kullanıyorsanız TabLayout.Tab setCustomView(android.view.View view)daha basittir. Her iki şekilde de nasıl yapacağınız aşağıda açıklanmıştır.

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

Özel bir görünüm kullanmıyorsanız, bunu böyle yapabilirsiniz

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

Bir StateListDrawable kullanarak seçili ve seçili olmayan çekmeceler veya renkler ve / veya çekmecelerle istediğinizi yapmak için benzer bir şey kullanın.


12

Sadece ayarlayın viewPager.setCurrentItem(index)ve ilişkili TabLayout ilgili sekmeyi seçecektir.


Bu benim için işe yaramadı. .Post yöntemini kullanmak zorunda kaldım.
arenaq

7

Bununla çözmeyi deneyebilirsiniz:

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

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

5

bunu dene

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

Teşekkürler. Benim için çalıştı. Ancak gecikmeli kullanmak iyi bir uygulama mı?
Harsh Shah

Arka uç sunucusundan sekme için metin getirdiğinizi varsayalım ve herhangi bir nedenden ötürü sunucunun gecikmesi durumunda, bu sistem iş parçacığı cihaz kaynaklarını gereksiz yere tüketecektir.
cammando

çok çirkin bir çözüm
Lester

Bu benim için işe yaramıyor. Kullanıcı bir sekmeyi tıklarsa, o sekme seçimini ertelemeyi nasıl sağlarım? Çalışacak bir şey bulamıyorum. Bunun yerine i == 1 (mViewPager.getCurrentItem () == 0) kullanmak için çalıştı ama çalışmıyor ve ne başka bir şey yapar.
iBEK

5

Biraz geç ama faydalı bir çözüm olabilir. TabLayout'umu doğrudan Fragment'ımda kullanıyorum ve Fragment's Lifecycle'da oldukça erken bir sekme seçmeye çalışıyorum. Benim için işe yarayan, TabLayout'un çocuk görüşlerini çizim android.view.View#postyöntemini kullanarak bitirmesini beklemekti . yani:

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

doğru cevap benim için çalıştı ama biraz gecikme güzel bir etki verecektir new Handler().postDelayed(()->{ tabLayout.post(() -> { tabLayout.getTabAt(myPosition).select(); }); },200);
Hisham

3

Ben am parçalarını geçmek için TabLayout kullanarak. Programlı olarak bir sekme seçmeye çalıştığım zaman tab.select(), benim TabLayout.OnTabSelectedListeneriçin onTabSelected(TabLayout.Tab tab)çok fazla kedere neden olacak olan , tetikleyeceğim hariç, çoğunlukla işe yarar. Dinleyiciyi tetiklemeden programlı seçim yapmanın bir yolunu arıyordum.

Bu yüzden @kenodoggy'nin yanıtını kullanımım için uyarladım. (Ben yanıtlayan çünkü, henüz oluşturulmamış çünkü başka iç nesnelerin bazı return null verecek bir sorunla karşı karşıya olduğu onActivityResult()daha önce ortaya çıkar benim parçası, gelen onCreate()söz etkinliktir içinde singleTaskveya singleInstancebir eğer ayrıntılı yukarı yazdım bu yüzden) / else hatası bildirecek ve bunlar olmadan düşecek NullPointerException, aksi takdirde tetiklenecektir. Kayıt için Timber kullanıyorum, eğer onun yerine ile kullanmıyorsanız 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");
    }
}

Burada tabLayout, XML'imdeki TabLayoutnesneye bağlı bellek değişkenimdir . Kaydırma sekmesi özelliğini kullanmıyorum, bu yüzden de kaldırdım.


3

viewPager.setCurrentItem () öğesini kullanmak için bir viewPager kullanmalısınız

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

            }
        });

2

görüntüleyiciniz için ekleyin:

 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 kilitlenmesini önlemek için işleyici üzerinde

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

1
"outofmemory kilitlenmesini önlemek" - neden geçerli öğeyi seçmek için ayrı bir konuya ihtiyacımız var?
AppiDevo

2

Farklı cevapların birleşik çözümü:

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

  myViewPager.setCurrentItem(position, true);

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


1

Varsayılan olarak bir sekme seçerseniz, sekme vurgulanır. Açıkça seçmek istiyorsanız, onTabSelected (TabLayout.Tab sekmesi) altında verilen açıklamalı kodu belirtilen sekme dizini konumunuzla kullanmak anlamına gelir. Bu kod, viewpager'ı kullanarak sekme seçili pozisyonundaki parça değişimini açıklar.

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

Bu da yardımcı olabilir

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

1

Öyleyse varsayılan sekmeniz ilk (0) olur ve bir parçaya geçerseniz, parçayı ilk kez manuel olarak değiştirmeniz gerekir. Bunun nedeni, sekmenin dinleyici kaydedilmeden önce seçilmesidir.

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

Alternatif olarak, aşağıdaki şekilde arama getTabAt(0).select()ve geçersiz kılmayı düşünebilirsiniz onTabReselected:

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

Bu işe yarayacaktır, çünkü esasen her sekme yeniden seçimindeki parçayı değiştiriyorsunuzdur.


0

TabLayout konumunu aşağıdaki işlevleri kullanarak ayarlayabilirsiniz

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

0

Anlamada sorun yaşıyorsanız, bu kod size yardımcı olabilir

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
}

Bunu kodunuza da ekleyebilirsiniz:

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

0

Bu şekilde dene.

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

0

u ViewPager olmadan TabLayout kullanıyorsanız bu yardımcı olur

 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

Kotlin Fix

viewPager.currentItem = 0

tabs.setupWithViewPager (viewPager)


0
TabLayout jobTabs = v.findViewById(R.id.jobTabs);
ViewPager jobFrame = v.findViewById(R.id.jobPager);
jobFrame.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(jobTabs));

sayfa görüntüleme kaydırma sayfası olarak sekmeyi seçer

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.