280

プログラムでTabLayoutのタブを選択するにはどうすればよいですか?

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

27 に答える 27

481

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

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

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

于 2015-06-19T18:08:41.557 に答える
98

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

void selectPage(int pageIndex){
    tabLayout.setScrollPosition(pageIndex,0f,true);
    viewPager.setCurrentItem(pageIndex);
}
于 2015-12-31T09:09:04.107 に答える
75

これを使って:

tabs.getTabAt(index).select();

currentTabIndex と index が同じ場合、フローは onTabSelected ではなく onTabReselected に送信されることに注意してください。

于 2016-04-12T06:16:31.357 に答える
39

これを使って:

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

currentTabIndex と index が同じ場合、フローは onTabSelected ではなく onTabReselected に送信されることに注意してください。

于 2016-09-10T11:18:11.803 に答える
13

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 を使用して、選択されたドローアブルと選択されていないドローアブルを切り替えたり、同様のものを使用して、色やドローアブルで必要なことを行います。

于 2016-01-14T04:03:28.770 に答える
6

これを試して

    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);
于 2016-08-24T04:50:22.333 に答える
3

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

new Handler().postDelayed(() -> {
  myViewPager.setCurrentItem(position, true);
  myTabLayout.setScrollPosition(position, 0f, true);
},
100);
于 2018-10-11T05:31:42.163 に答える
2

TabLayoutを使用してフラグメントを切り替えています。tab.select()を使用してプログラムでタブを選択しようとすると、TabLayout.OnTabSelectedListenerがトリガーされ、onTabSelected(TabLayout.Tab tab)多くの悲しみを引き起こすことを除いて、ほとんどの場合は機能します。リスナーをトリガーせずにプログラムによる選択を行う方法を探していました。

だから私は@kenodoggyの答えを私の用途に合わせました。さらに、一部の内部オブジェクトが null を返すという問題に直面していました (アクティビティがorの場合onActivityResult()に前に発生するフラグメントから応答していたため、まだ作成されていないため)。 /else シーケンスは、エラーを報告し、それ以外の場合はトリガーせずにフォールスルーします。で代用を使用していない場合は、ロギングに Timber を使用します。onCreate()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 内のオブジェクトにバインドされたメモリ変数です。また、タブのスクロール機能は使用しないので、それも削除しました。

于 2016-12-08T13:59:12.907 に答える
1

ビューページャーに追加します。

 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);
        }
    });
}
于 2016-04-30T00:19:24.033 に答える
0

デフォルトでは、タブを選択すると強調表示されます。明示的に選択する場合は、指定したタブ インデックス位置で 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);
  }
 }
}
于 2016-02-01T09:52:46.453 に答える
0
TabLayout jobTabs = v.findViewById(R.id.jobTabs);
ViewPager jobFrame = v.findViewById(R.id.jobPager);
jobFrame.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(jobTabs));

これにより、ビューページャーのスワイプページとしてタブが選択されます

于 2020-05-07T05:45:55.347 に答える