टैबलैटआउट टैब चयन


जवाबों:


418

यदि आप उस टैब का सूचकांक जानते हैं जिसे आप चुनना चाहते हैं, तो आप ऐसा कर सकते हैं:

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

यह तकनीक तब भी काम करती है जब आप TabPayout का उपयोग बिना ViewPager द्वारा किया जाता है (जो कि असामान्य है, और शायद बुरा अभ्यास है, लेकिन मैंने इसे पूरा कर लिया है)।


10
यह समाधान केवल तभी काम करता है जब टैब को एक्शन बार में जोड़ा गया हो, जो कि संभव नहीं है। के लिए प्रलेखन से TabLayout.Tab.select(): "इस टैब का चयन करें। केवल तभी मान्य है जब टैब को कार्रवाई पट्टी में जोड़ा गया है।"
डैनियल केविस्ट

7
@DanielKvist, वास्तव में प्रलेखन ही गलत है। स्रोत कोड स्वयं के लिए बोलता है। यह उत्तर स्वीकृत उत्तर होना चाहिए।
जेसन स्पार्क

@JasonSparc हम्म, मुझे याद है कि मेरे लिए यह काम नहीं कर रहा था जब मैंने आखिरी बार इस समाधान की कोशिश की थी, लेकिन मैं देखूंगा कि क्या मैं दोहरी जांच कर सकता हूं कि यह मेरे लिए कैसे काम करता है। आपने कोशिश की है? यह कुछ मामलों में काम कर सकता है, जबकि अन्य मामलों में नहीं? यह एपीआई-स्तर या कुछ इसी तरह पर निर्भर हो सकता है?
डैनियल केविस्ट

आधे पके हुए उत्तर पर हवा को साफ़ करने के लिए धन्यवाद! क्योंकि यह सिर्फ स्टैंडअलोन टैबलैट पर काम नहीं करता है क्योंकि शायद आपके द्वारा बताए गए कारण; यह एक्शनबार में टैब्स के साथ काम करने के लिए है!
सूद 26००

3
ViewPager के बिना TabLayout का उपयोग करना बुरा व्यवहार क्यों माना जाना चाहिए?
tomalf2

85

यह मैंने इसे कैसे हल किया:

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

3
चयनित जवाब मेरे लिए काम नहीं किया, लेकिन यह एक किया था।
रफाल ज़वाद्ज़की

महान समाधान! मेरे लिए ठीक काम किया, जब मुझे पहले पृष्ठ पर वापस जाने की आवश्यकता थी दोनों देखें पेजर और टैब व्यू
sashk0

49

इसे इस्तेमाल करो:

tabs.getTabAt(index).select();

धन्यवाद, यह मेरे कार्यान्वयन के लिए एक सुरक्षित समाधान के रूप में
islam फैड

Objects.requireNonNull(tabs.getTabAt(position)).select();उपयोग करने के लिए सुरक्षित
विलियन लोप्स

1
ध्यान रखें कि, यदि currentTabIndex और index एक समान हैं, तो यह आपके प्रवाह को onTabReselected पर भेजता है, न कि onTabSelected पर।
अभिषेक कुमार

@WilliaanLope, यह आपको एनपीआई से सुरक्षा नहीं देगा, बस इसे जल्द ही फेंक देगा
क्रिज़ीस्तोफ़ कुबिकी

33

इसे इस्तेमाल करो:

<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 में:

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

क्या होगा यदि टैबमोड स्क्रॉल करने योग्य है?
GvSharma

मुझे भी ऐसा ही लगता है, कृपया पहले आप यह कोशिश करें।
प्रवीण सुथार

23

यह शायद अंतिम समाधान नहीं है , और इसके लिए आवश्यक है कि आप TabLayoutएक साथ एक का उपयोग करेंViewPager , लेकिन यह है कि मैंने इसे कैसे हल किया:

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

मैंने परीक्षण किया कि इस कोड का उपयोग करने का प्रदर्शन प्रभाव सबसे पहले सीपीयू- और मेमोरी मॉनिटर को देखते हुए एंड्रॉइड स्टूडियो में विधि को चलाते समय है, फिर इसकी तुलना सीपीयू और मेमोरी पर डालने वाले लोड से करते हुए जब मैंने पृष्ठों के बीच नेविगेट किया खुद (स्वाइप जेस्चर का उपयोग करके), और अंतर काफी बड़ा नहीं है, इसलिए कम से कम यह एक भयानक समाधान नहीं है ...

आशा है कि यह किसी की मदद करता है!


1
जब मैंने डीएपी का समाधान ( tabLayout.setScrollPosition(pageIndex,0f,true);) किया, जब मैंने टैब पर दाईं ओर क्लिक किया, तो इसने व्यू पेज के पेज को अपडेट नहीं किया (मुझे नहीं पता क्यों)। केवल बाएं टैब पर और फिर दाईं टैब पर फिर से क्लिक करने से अंत में पृष्ठ के दाईं ओर का पृष्ठ अपडेट हो जाएगा, जो बहुत अड़चने वाला है। लेकिन इस समाधान में कोई गड़बड़ नहीं थी।
रॉक ली

12

यदि आप tab.select () का उपयोग नहीं कर सकते हैं और आप ViewPager का उपयोग नहीं करना चाहते हैं, तो आप अभी भी प्रोग्राम टैब का चयन कर सकते हैं। यदि आप TabLayout.Tab setCustomView(android.view.View view)इसके माध्यम से कस्टम दृश्य का उपयोग कर रहे हैं, तो यह सरल है। यहां बताया गया है कि इसे दोनों तरीकों से कैसे किया जाए।

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

यदि आप एक कस्टम दृश्य का उपयोग नहीं कर रहे हैं तो आप इसे इस तरह से कर सकते हैं

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

चयनित और अचयनित ड्रॉबल्स या रंग और / या ड्रॉबल्स के साथ जो आप चाहते हैं, उसके समान टॉगल करने के लिए स्टेटलिस्टेबलेबल का उपयोग करें।


12

बस सेट viewPager.setCurrentItem(index)और संबंधित टैबलैट संबंधित टैब का चयन करेगा।


इसने मेरे लिए काम नहीं किया। मुझे .post विधि का उपयोग करना था।
१२:

7

आप इसे इसके साथ हल करने का प्रयास कर सकते हैं:

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

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

5

इसे इस्तेमाल करे

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

धन्यवाद। यह मेरे लिए काम किया। लेकिन क्या देरी से इस्तेमाल करना अच्छा है?
हर्ष शाह

मुझे लगता है कि किसी भी लेआउट कारण पर थ्रेड चलाना बुरा है यदि मान लें कि आप बैकएंड सर्वर से टैब के लिए टेक्स्ट ला रहे हैं और यदि किसी कारण से b'coz सर्वर में देरी होती है तो यह सिस्टम थ्रेड आपके डिवाइस संसाधनों का अनावश्यक रूप से उपभोग करेगा।
कैममांडो

इतना बदसूरत समाधान
लेस्टर

यह मेरे लिए काम नहीं करता है। मैं यह कैसे करूं कि यदि उपयोगकर्ता टैब पर क्लिक करता है, तो उस टैब के चयन में देरी हो सकती है? मुझे काम करने के लिए कुछ भी नहीं मिल रहा है। मैंने इसके बजाय कोशिश की अगर मैं == 1 का उपयोग करने के लिए (mViewPager.getCurrentItem () == 0) लेकिन यह काम नहीं करता है और न ही कुछ और करता है।
IBEK

5

थोड़ा देर से लेकिन एक उपयोगी समाधान हो सकता है। मैं सीधे अपने Fragment में अपने TabLayout का उपयोग कर रहा हूं और Fragment के जीवनचक्र में काफी पहले टैब का चयन करने की कोशिश कर रहा हूं। तब तक मेरे लिए जो काम किया गया था, वह तब तक इंतजार करना था जब तक कि तबलायूट ने android.view.View#postविधि का उपयोग करके अपने बच्चे के विचारों को चित्रित नहीं किया । अर्थात:

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

सही उत्तर ने मेरे लिए काम किया लेकिन कुछ देरी से यह अच्छा प्रभाव देगा new Handler().postDelayed(()->{ tabLayout.post(() -> { tabLayout.getTabAt(myPosition).select(); }); },200);
हिशम

3

मैं कर रहा हूँ TabLayout का उपयोग कर टुकड़े स्विच करने के लिए। यह सबसे अधिक भाग के लिए काम करता है, जब भी मैंने प्रोग्राम का उपयोग करके टैब को चुनने की कोशिश की tab.select(), तो मैं TabLayout.OnTabSelectedListenerइसे ट्रिगर करूंगाonTabSelected(TabLayout.Tab tab) , जिससे मुझे बहुत दुःख होगा। मैं श्रोता को ट्रिगर किए बिना प्रोग्रामेटिक चयन करने का एक तरीका ढूंढ रहा था।

इसलिए मैंने अपने उपयोग के लिए @kenodoggy के उत्तर को अनुकूलित किया। मैं आगे एक समस्या का सामना कर रहा था जहां कुछ आंतरिक वस्तुएं वापस लौट आएंगी (क्योंकि वे अभी तक नहीं बनाए गए थे, क्योंकि मैं onActivityResult()अपने टुकड़े से जवाब दे रहा था , जो onCreate()कि गतिविधि होने से पहले होता है ) singleTaskया singleInstanceऐसा होता है इसलिए मैंने एक विस्तृत लिखा था अगर / अन्यथा अनुक्रम जो त्रुटि की रिपोर्ट करेगा और उसके बिना गिर NullPointerExceptionजाएगा अन्यथा ट्रिगर होगा। यदि आप उस विकल्प के साथ उपयोग नहीं कर रहे हैं, तो मैं लॉगिंग के लिए टिम्बर का उपयोग करता हूं 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");
    }
}

यहाँ, tabLayout मेरा मेमोरी वेरिएबल है जो TabLayoutमेरे XML में ऑब्जेक्ट के लिए है। और मैं स्क्रॉलिंग टैब सुविधा का उपयोग नहीं करता हूं इसलिए मैंने उसे भी हटा दिया।


3

आप viewPager.setCurrentItem () का उपयोग करने के लिए एक viewPager का उपयोग करना चाहिए

 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

अपने दृष्टिकोण के लिए जोड़ें:

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

// दुर्घटना को रोकने के लिए हैंडलर पर

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

1
"क्रैश आउटोफ़ेमोरी को रोकें" - हमें वर्तमान आइटम का चयन करने के लिए अलग थ्रेड की आवश्यकता क्यों है?
अप्पादेवो

2

विभिन्न उत्तरों से एक संयुक्त समाधान है:

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

  myViewPager.setCurrentItem(position, true);

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

2

साथ TabLayoutद्वारा प्रदान की सामग्री घटक लाइब्रेरी बस का उपयोग selectTabविधि:

TabLayout tabLayout = findViewById(R.id.tab_layout);
tabLayout.selectTab(tabLayout.getTabAt(index));

यहां छवि विवरण दर्ज करें

इसके लिए संस्करण 1.1.0 की आवश्यकता है।


नहीं, selectTab एक पैकेज-प्राइवेट विधि है।
XY

@ xyuber.com मैंने एक महत्वपूर्ण जानकारी जोड़ी। इसके लिए संस्करण 1.1.0 की आवश्यकता है। यह विधि अभी सार्वजनिक है
गेब्रियल मारीओटी

1

डिफ़ॉल्ट रूप से यदि आप एक टैब का चयन करते हैं तो इसे हाइलाइट किया जाएगा। यदि आप स्पष्ट रूप से चयन करना चाहते हैं तो अपने निर्दिष्ट टैब इंडेक्स स्थिति के साथ onTabSelected (TabLayout.Tab टैब) के तहत दिए गए टिप्पणी कोड का उपयोग करें। यह कोड दृश्यदर्शी का उपयोग करके टैब चयनित स्थिति पर परिवर्तन के टुकड़े के बारे में बताएगा।

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

इससे भी मदद मिल सकती है

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

यदि ऐसा होता है कि आपका डिफ़ॉल्ट टैब पहले वाला (0) है और आप किसी खंड पर स्विच करने के लिए होते हैं, तो आपको पहली बार टुकड़े को मैन्युअल रूप से प्रतिस्थापित करना होगा। ऐसा इसलिए है क्योंकि श्रोता के पंजीकृत होने से पहले टैब का चयन किया जाता है।

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

वैकल्पिक रूप से, आप कॉलिंग getTabAt(0).select()और ओवरराइडिंग पर विचार कर सकते हैं onTabReselected:

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

यह काम करेगा क्योंकि आप अनिवार्य रूप से हर टैब के पुनरुत्थान पर टुकड़े की जगह ले रहे हैं।


0

आप निम्न कार्यों का उपयोग करके TabLayout स्थिति सेट कर सकते हैं

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

0

अगर आपको समझने में दिक्कत है, तो यह कोड आपकी मदद कर सकता है

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
}

आप इसे अपने कोड में भी जोड़ सकते हैं:

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

0

इस तरह आजमाएं।

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

0

अगर यू TabLayout का उपयोग कर रहे हैं बिना viewPager यह मदद करता है

 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
TabLayout jobTabs = v.findViewById(R.id.jobTabs);
ViewPager jobFrame = v.findViewById(R.id.jobPager);
jobFrame.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(jobTabs));

यह पेजर स्वाइप पेज के रूप में टैब का चयन करेगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.