탭 레이아웃 탭 선택
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));
버전 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
'programing' 카테고리의 다른 글
| 셀에서 UITableViewCell indexPath를 가져오는 방법은 무엇입니까? (0) | 2023.08.16 |
|---|---|
| 현재 날짜에 일을 추가하는 방법은 무엇입니까? (0) | 2023.08.16 |
| 도커의 ASPNETCORE_ENERVICE (0) | 2023.08.16 |
| CSS에서 id와 class의 차이점은 무엇이며, 언제 사용해야 합니까? (0) | 2023.08.16 |
| 다운로드한 글꼴을 디코딩하지 못했습니다. OTS 구문 분석 오류: 잘못된 버전 태그 + 레일 4 (0) | 2023.08.16 |
