TabLayoutタブの選択


回答:


418

選択するタブのインデックスがわかっている場合は、次のように行うことができます。

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

この手法は、ViewPagerを使用せずにTabLayoutを単独で使用している場合でも機能します(これは典型的ではなく、おそらく悪い習慣ですが、私はそれが実行されたのを見てきました)。


10
このソリューションは、タブがアクションバーに追加されている場合にのみ機能します。常にそうであるとは限りません。ドキュメントからTabLayout.Tab.select()「このタブを選択してください。タブがアクションバーに追加されている場合にのみ有効です。」
Daniel Kvist 2015年

7
@DanielKvist、実際にはドキュメント自体が正しくありません。ソースコードはそれ自体を物語っています。この答えは受け入れられた答えでなければなりません。
Jason Sparc

@JasonSparcうーん、私が最後にこのソリューションを試したときはうまくいかなかったのを覚えていますが、それがどのように機能するかをダブルチェックできるかどうか確認します。やってみました?他の場合ではなく、それが機能する場合もありますか?APIレベルまたは類似したものに依存する可能性がありますか?
Daniel Kvist、2016

半分調理された答えで空気をクリアしてくれてありがとう!おそらくあなたが述べた理由のために、スタンドアロンのTabLayoutではそれが機能しないからです。これは、Actionbarのタブを操作するためのものです!
sud007 2016

3
ViewPagerなしでTabLayoutを使用することは悪い習慣と見なされるべきなのはなぜですか?
tomalf2 2017年

84

これは私がそれを解決した方法です:

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

3
選択した答えは私にはうまくいきませんでしたが、これはうまくいきました。
Rafal Zawadzki

素晴らしい解決策!viewPagerとTabViewの両方を最初のページに戻す必要があるとき、私にとってはうまくいきました
sashk0

49

これを使って:

tabs.getTabAt(index).select();

おかげで、これは私の実装に関して安全な解決策です
イスラム教のファリッド

Objects.requireNonNull(tabs.getTabAt(position)).select();安全に使用できます
ウィリアンロペス

1
currentTabIndexとインデックスが同じ場合、フローがonTabSelectedではなくonTabReselectedに送信されることに注意してください。
Abhishek Kumar

@WilliaanLopes、これはあなたをNPIから保護せず、すぐに投げます
Krzysztof Kubicki

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

tabModeがスクロール可能な場合はどうなりますか?
GvSharma

私も同じだと思います、まずはそれを試してみてください。
Pravin Suthar

23

これはおそらく究極の解決策ではなく、とを一緒に使用する必要がありますTabLayoutViewPagerが、これが私が解決した方法です。

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

このコードを使用することによるパフォーマンスへの影響がどれほど大きいかをテストするには、まずメソッドの実行中にAndroid StudioのCPUモニターとメモリーモニターを確認し、次にページ間を移動したときにCPUとメモリーにかかった負荷と比較します。私自身(スワイプジェスチャーを使用)、その違いはそれほど大きくないので、少なくともそれは恐ろしい解決策ではありません...

これが誰かを助けることを願っています!


1
ダップの解決策(tabLayout.setScrollPosition(pageIndex,0f,true);)を実行したとき、右側のタブをクリックしても、ViewPagerのページが更新されませんでした(理由はわかりません)。左側のタブをもう一度クリックしてから、右側のタブをもう一度クリックするだけで、最終的にページが更新され、右側のタブのページが表示されます。これは非常に問題があります。しかし、このソリューションには問題はありませんでした。
Rock Lee

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
}

StateListDrawableを使用して、選択されたドローアブルと選択されていないドローアブル、または色やドローアブルで必要な操作を行うのと同じようなものを切り替えます。


12

設定するだけviewPager.setCurrentItem(index)で、関連するTabLayoutがそれぞれのタブを選択します。


これは私にはうまくいきませんでした。.postメソッドを使用する必要がありました。
arenaq

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

Thanks.itは私のために働いた。しかし、遅延を使用することは良い習慣ですか?
Harsh Shah、

バックエンドサーバーからタブのテキストをフェッチしていると仮定し、何らかの理由でサーバーが遅延した場合、このシステムスレッドがデバイスリソースを異常に消費する場合、レイアウトの原因のいずれかでスレッドを実行することは悪いことだと思います。
cammando 2017年

とても醜い解決策
レスター

これは私にはうまくいきません。ユーザーがタブをクリックした場合、そのタブの選択を遅らせるにはどうすればよいですか?何も動作しません。代わりにi == 1(mViewPager.getCurrentItem()== 0)を使用しようとしましたが、機能せず、他にも何もしません。
iBEK

5

少し遅れますが、便利な解決策になるかもしれません。私はフラグメントで直接TabLayoutを使用しており、フラグメントのライフサイクルのかなり早い段階でタブを選択しようとしています。私にとってうまくいったのは、TabLayoutが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の回答を自分の使用に適合させました。内部オブジェクトの一部がnullを返すという問題にさらに直面していました(アクティビティがまたはの場合にonActivityResult()以前onCreate()に発生する、フラグメントから応答していたため、オブジェクトがまだ作成されていないため)。 / elseシーケンス。エラーを報告し、それ以外の場合はトリガーされずに終了します。私がロギングにTimberを使用します。singleTasksingleInstanceNullPointerExceptionLog.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
「メモリ不足によるクラッシュを防ぐ」-現在のアイテムを選択するために別のスレッドが必要なのはなぜですか?
AppiDevo 2017

2

さまざまな回答を組み合わせたソリューションは次のとおりです。

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

  myViewPager.setCurrentItem(position, true);

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

2

Material Components LibraryTabLayout提供するので、次のメソッドを使用します。selectTab

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

ここに画像の説明を入力してください

バージョン1.1.0が必要です。


いいえ、selectTabはパッケージプライベートメソッドです。
XY

@ xyuber.com重要な情報を追加しました。バージョン1.1.0が必要です。メソッドは現在公開されています
Gabriele Mariotti

1

デフォルトでは、タブを選択すると強調表示されます。明示的に選択する場合は、onTabSelected(TabLayout.Tab tab)の下にある指定のコメント付きコードを、指定したタブインデックス位置で使用することを意味します。このコードは、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);
  }
 }
}

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

理解に問題がある場合は、このコードが役立ちます

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

uがviewPagerなしでTabLayoutを使用している場合、これは役立ちます

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

これはタブをビューページャースワイプページとして選択します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.