programing

탭 레이아웃 탭 선택

minimums 2023. 8. 16. 22:07
반응형

탭 레이아웃 탭 선택

TabLayout에서 탭을 프로그래밍 방식으로 선택하는 방법은 무엇입니까?

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

선택할 탭의 인덱스를 알고 있는 경우 다음과 같이 수행할 수 있습니다.

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

이 기술은 ViewPager 없이 TabLayout을 사용하는 경우에도 효과적입니다(일반적인 방법이고, 아마도 나쁜 방법일 수도 있지만, 저는 그렇게 하는 것을 보았습니다).

이렇게 해결했습니다.

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

사용:

tabs.getTabAt(index).select();

현재 TabIndex와 인덱스가 동일한 경우 TabSelected가 아닌 onTabReSelected로 흐름을 전송합니다.

사용:

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

OnClick Listener에서 다음을 수행합니다.

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

현재 TabIndex와 인덱스가 동일한 경우 TabSelected가 아닌 onTabReSelected로 흐름을 전송합니다.

이것은 아마도 궁극적인 해결책이 아닐 것이며, 와 함께사용해야 하지만, 이렇게 해결했습니다.

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

이 코드를 사용하는 것이 성능에 미치는 영향이 얼마나 큰지 먼저 방법을 실행하면서 Android Studio의 CPU와 메모리 모니터를 보고 직접 페이지를 이동할 때 CPU와 메모리에 걸리는 부하와 비교해 보았습니다(스와이프 제스처 사용).그래서 적어도 끔찍한 해결책은 아닙니다...

이것이 누군가에게 도움이 되기를 바랍니다!

설정하기viewPager.setCurrentItem(index)연결된 TabLayout이 해당 탭을 선택합니다.

재료 구성요소 라이브러리에서 제공하는 를 사용하여 다음 방법을 사용합니다.

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

enter image description here

버전 1.1.0이 필요합니다.

탭을 사용할 수 없는 경우.()를 선택하고 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
}

상태 목록드로잉 가능을 사용하여 선택한 드로잉 가능과 선택하지 않은 드로잉 가능 사이를 전환하거나 색상 및/또는 드로잉 가능으로 원하는 작업을 수행할 수 있습니다.

조금 늦었지만 유용한 해결책이 될 수 있습니다.나는 내 단편에서 내 탭 레이아웃을 직접 사용하고 단편의 수명 주기 초기에 탭을 선택하려고 합니다.TabLayout이 하위 뷰 그리기를 완료할 때까지 기다린 것이 효과적이었습니다.android.view.View#post 법즉. 방:

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

다음을 사용하여 문제를 해결할 수 있습니다.

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

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

최신의 간단한 솔루션이 도움이 되었습니다.

binding.tablayout.selectTab(binding.tablayout.getTabAt(tabPosisiton))

또는

with(binding.tablayout) {
    selectTab(getTabAt(tabPosisiton))
}

그리고.tabPosition00부터

이것을 먹어보세요.

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

Kotlin 사용자:

Handler(Looper.getMainLooper()).postDelayed(
            { tabLayout.getTabAt(position).select() }, 100
        )

스크롤해야 할 경우를 대비하여 탭 레이아웃도 스크롤됩니다.

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

            }
        });

다양한 답변의 조합된 솔루션은 다음과 같습니다.

new Handler().postDelayed(() -> {
  myViewPager.setCurrentItem(position, true);
  myTabLayout.setScrollPosition(position, 0f, true);
},
100);

TabLayout을 사용하여 fragment를 전환하고 있습니다.프로그램을 사용하여 탭을 선택하려고 할 때를 제외하고 대부분 작동합니다.tab.select(),나의TabLayout.OnTabSelectedListener그것이 계기가 될 것입니다.onTabSelected(TabLayout.Tab tab)하지 않고 을 할 수 .저는 듣는 사람을 자극하지 않고 프로그램 선택을 할 수 있는 방법을 찾고 있었습니다.

그래서 저는 @kenodoggy의 대답을 제 사용법에 맞게 수정했습니다.또한 내부 개체 중 일부가 null을 반환하는 문제에 직면했습니다(아직 생성되지 않았기 때문에, 응답 중이었기 때문에).onActivityResult()그 전에 일어난 내 단편에서.onCreate()이 활이있경우는인 singleTask또는singleInstance그래서 저는 오류를 보고하고 오류 없이 실패하는 상세한 if/else 시퀀스를 작성했습니다.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내 XML에 있는 개체입니다. 그리고 스크롤 탭 기능을 사용하지 않기 때문에 그것도 제거했습니다.

viewPager와 함께 TabLayout을 사용하는 경우 도움이 됩니다.추가 페이지 수신기에서 ViewPager를 사용하여 TabLayout을 설정합니다.

를 직접개별 ) TabLayout을 하십시오.tabLayout.getTabAt(position_you_want_to_set).select()

   /* will be invoked whenever the page changes or is incrementally scrolled*/
    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            tabLayout.getTabAt(position).select();
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

ViewPager2가 구현된 앱에서는 이 기능이 작동하지 않습니다. 이를 사용해야 합니다.

viewPager2.setCurrentItem(position);

東京의 onConfigureTab,onConfigureTabTabLayoutMediator TabLayoutMediator를 할 때

TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(
                tabLayout, viewPager2, new TabLayoutMediator.TabConfigurationStrategy() {
            @Override
            public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
                switch (position){
                    case 0 : tab.setIcon(getResources().getDrawable(R.drawable.camera));
                            break;
                    case 1 : tab.setText("CHAT");
                            viewPager2.setCurrentItem(position); // when app starts this will be the selected tab
                            break;
                    case 2 : tab.setText("STATUS");
                            break;
                    case 3 : tab.setText("CALL");
                        break;
                }
            }
        }
        );
        tabLayoutMediator.attach();

보기 페이지에 추가:

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

기본적으로 탭을 선택하면 탭이 강조 표시됩니다.명시적으로 선택하려면 TabSelected(TabLayout)에서 주어진 주석 코드를 사용합니다.탭 탭)에 지정된 탭 인덱스 위치가 표시됩니다.이 코드는 보기 페이지를 사용하여 탭 선택 위치의 조각 변경에 대해 설명합니다.

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

이것도 도움이 될 수 있습니다.

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

다음 기능을 사용하여 TabLayout 위치를 설정할 수 있습니다.

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

기본 탭이 첫 번째 탭(0)인 경우 fragment로 전환하면 fragment를 처음으로 수동으로 교체해야 합니다.수신기가 등록되기 전에 탭이 선택되어 있기 때문입니다.

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() 및우위순선iding를 재정의함onTabReselected 예:

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

기본적으로 모든 탭을 다시 선택할 때마다 조각을 교체하기 때문에 이 기능이 작동합니다.

이해하는 데 문제가 있다면 이 코드가 도움이 될 수 있습니다.

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

이쪽으로 오세요.

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

보기 없이 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) {

        }
    });

코틀린 픽스

viewPage.currentItem = 0

tabs.SetupWithViewPager(viewPager)

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

그러면 페이지 보기 페이지로 탭이 선택됩니다.

Viewpage2에서 Kotlin은 다른 답변에 도움이 되지 않았으며, 오직 이것만 아래에서 작동했습니다.제 경우에는 단편적인 결과 청취자의 입장입니다.

TabLayoutMediator(binding.tabLayout, binding.viewPager2) { _, _ ->
    binding.viewPager2 = position
}.attach()

언급URL : https://stackoverflow.com/questions/30796710/tablayout-tab-selection

반응형