탭 레이아웃 탭 선택


답변:


418

선택하려는 탭의 색인을 알고 있으면 다음과 같이 할 수 있습니다.

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

이 기술은 ViewPager없이 TabLayout을 자체적으로 사용하는 경우에도 작동합니다 (비정형적이고 아마도 나쁜 습관이지만 실제로 보았습니다).


10
이 솔루션은 탭이 작업 표시 줄에 추가 된 경우에만 작동하며 항상 그렇지 않을 수도 있습니다. 설명서에서 TabLayout.Tab.select(): "이 탭을 선택하십시오. 탭이 조치 표시 줄에 추가 된 경우에만 유효합니다."
Daniel Kvist

7
@DanielKvist, 실제로 문서 자체가 잘못되었습니다. 소스 코드는 그 자체를 말합니다. 이 답변은 허용되는 답변이어야합니다.
Jason Sparc

@JasonSparc 흠, 나는이 솔루션을 마지막으로 시도했을 때 나에게 효과가 없다는 것을 기억하지만, 그것이 어떻게 작동하는지 다시 확인할 수 있는지 확인할 것이다. 시도 했습니까? 어떤 경우에는 작동하지만 다른 경우에는 작동하지 않습니까? API 수준이나 비슷한 것에 의존 할 수 있습니까?
Daniel Kvist

반쯤 조리 된 답변에서 Air를 비워 주셔서 감사합니다! 그것은 당신이 언급 한 이유 때문에 아마도 독립형 TabLayout에서는 작동하지 않기 때문입니다. Actionbar의 탭과 함께 작동합니다!
sud007

3
ViewPager없이 TabLayout을 사용하는 것이 나쁜 습관으로 간주되어야하는 이유는 무엇입니까?
tomalf2

85

이것이 내가 해결 한 방법입니다.

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();안전한 사용
Williaan Lopes 2018

1
currentTabIndex와 index가 동일하면 onTabSelected가 아니라 onTabReselected로 플로우를 보냅니다.
Abhishek Kumar

@WilliaanLopes,이 NPI로부터 당신을 보호하지 않습니다, 단지 빨리 그것을 던져 것
르지 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
dap의 솔루션 ( 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);

고마워. 그것은 나를 위해 일했다. 그러나 지연을 사용하는 것이 좋습니다?
Harsh Shah

백엔드 서버에서 탭의 텍스트를 가져오고 서버가 지연되는 이유가 있으면 시스템 스레드가 무의식적으로 장치 리소스를 소비한다고 가정하면 레이아웃 원인 중 하나에서 스레드를 실행하는 것이 좋지 않습니다.
cammando

너무 못생긴 솔루션
Lester

이것은 나를 위해 작동하지 않습니다. 사용자가 탭을 클릭하면 해당 탭 선택이 지연되도록하려면 어떻게해야합니까? 일을 할 수 없습니다. 대신 i == 1 인 경우 (mViewPager.getCurrentItem () == 0)을 시도했지만 작동하지 않으며 다른 것도 수행하지 않습니다.
iBEK

5

조금 늦었지만 유용한 솔루션 일 수 있습니다. Fragment에서 직접 TabLayout을 사용하고 있으며 Fragment 's Lifecycle에서 탭을 매우 일찍 선택하려고합니다. 나를 위해 일한 것은 TabLayout이 android.view.View#post메소드 를 사용하여 자식 뷰 그리기를 마칠 때까지 기다리는 것이 었습니다 . 즉 :

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

정답은 나를 위해 일했지만 약간의 지연이 좋은 효과를 줄 것이다 new Handler().postDelayed(()->{ tabLayout.post(() -> { tabLayout.getTabAt(myPosition).select(); }); },200);
Hisham

3

내가 하고 조각을 전환 할 TabLayout를 사용하여. 내가 프로그래밍 사용하여 탭을 선택하려고 할 때마다 제외하고, 대부분의 경우 작동 tab.select(), 나의 TabLayout.OnTabSelectedListener발생하게 onTabSelected(TabLayout.Tab tab)나에게 많은 슬픔을 일으킬 것이다. 청취자를 유발하지 않고 프로그래밍 방식으로 선택하는 방법을 찾고있었습니다.

그래서 @kenodoggy의 대답을 내 용도에 맞게 조정했습니다. 나는 내부 객체 중 일부가 null을 반환하는 문제에 직면했다 ( 활동이 또는 인 경우 onActivityResult()이전 onCreate()에 발생하는 내 조각에서 응답했기 때문에 아직 생성되지 않았기 때문에 ). / else 시퀀스는 오류를보고하고 그렇지 않으면 트리거되지 않습니다. 와 같은 대체물을 사용하지 않는 경우 로깅을 위해 목재를 사용합니다 .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은 TabLayoutXML 의 객체에 바인딩 된 메모리 변수 입니다. 그리고 스크롤 탭 기능을 사용하지 않으므로 제거했습니다.


3

viewPager를 사용하여 viewPager.setCurrentItem ()을 사용해야합니다.

 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를 위해 추가하십시오 :

 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

2

다른 답변의 결합 된 솔루션은 다음과 같습니다.

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

  myViewPager.setCurrentItem(position, true);

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


1

기본적으로 탭을 선택하면 강조 표시됩니다. 명시 적으로 선택하려는 경우 onTabSelected (TabLayout.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

기본 탭이 첫 번째 탭이고 조각으로 전환하면 조각을 처음으로 수동으로 바꿔야합니다. 리스너가 등록되기 전에 탭이 선택 되었기 때문입니다.

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

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.