Yanıtlar:
Seçmek istediğiniz sekmenin dizinini biliyorsanız, bunu şu şekilde yapabilirsiniz:
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
TabLayout.Tab tab = tabLayout.getTabAt(someIndex);
tab.select();
TabLayout'u bir ViewPager olmadan (hatta atipik ve muhtemelen kötü bir uygulamadır, ancak yapıldığını gördüm) kullansanız bile bu teknik çalışır.
Ben böyle çözdüm:
void selectPage(int pageIndex){
tabLayout.setScrollPosition(pageIndex,0f,true);
viewPager.setCurrentItem(pageIndex);
}
Bunu kullan:
tabs.getTabAt(index).select();
Objects.requireNonNull(tabs.getTabAt(position)).select();
güvenli
Bunu kullan:
<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'da sonra:
TabLayout tabLayout = (TabLayout) findViewById(R.id.patienthomescreen_tabs);
TabLayout.Tab tab = tabLayout.getTabAt(someIndex);
tab.select();
Bu muhtemelen nihai çözüm değildir ve bunu kullanmanızı gerektirir TabLayout
bir ile buluşmanızıViewPager
, ama bunu nasıl çözdüğünü şudur:
void selectPage(int pageIndex)
{
viewPager.setCurrentItem(pageIndex);
tabLayout.setupWithViewPager(viewPager);
}
Bu kodu kullanmanın performans etkisinin, yöntemi çalıştırırken önce Android Studio'daki CPU ve bellek monitörlerine bakarak ne kadar büyük olduğunu test ettikten sonra, sayfalar arasında dolaştığımda CPU ve belleğe yüklenen yük ile karşılaştırarak (kaydırma hareketlerini kullanarak) ve fark önemli ölçüde büyük değil, bu yüzden en azından korkunç bir çözüm değil ...
Umarım bu birine yardımcı olur!
tabLayout.setScrollPosition(pageIndex,0f,true);
) yaptığımda, sağdaki sekmeye tıkladığımda, ViewPager'in sayfasını güncellemedi (nedenini bilmiyorum). Yalnızca sol sekmeyi ve ardından sağ sekmeyi tekrar tıklamak, sayfayı son derece sağa doğru sekmenin sayfası olacak şekilde güncelleyecektir. Ancak bu çözümde aksaklık yoktu.
Tab.select () yöntemini kullanamıyorsanız ve bir ViewPager kullanmak istemiyorsanız, yine de programlı olarak bir sekme seçebilirsiniz. Üzerinden özel bir görünüm kullanıyorsanız TabLayout.Tab setCustomView(android.view.View view)
daha basittir. Her iki şekilde de nasıl yapacağınız aşağıda açıklanmıştır.
// 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
}
Özel bir görünüm kullanmıyorsanız, bunu böyle yapabilirsiniz
// 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
}
Bir StateListDrawable kullanarak seçili ve seçili olmayan çekmeceler veya renkler ve / veya çekmecelerle istediğinizi yapmak için benzer bir şey kullanın.
Sadece ayarlayın viewPager.setCurrentItem(index)
ve ilişkili TabLayout ilgili sekmeyi seçecektir.
Bununla çözmeyi deneyebilirsiniz:
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(mViewPager);
TabLayout.Tab tab = tabLayout.getTabAt(pos);
if (tab != null) {
tab.select();
}
bunu dene
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);
Biraz geç ama faydalı bir çözüm olabilir. TabLayout'umu doğrudan Fragment'ımda kullanıyorum ve Fragment's Lifecycle'da oldukça erken bir sekme seçmeye çalışıyorum. Benim için işe yarayan, TabLayout'un çocuk görüşlerini çizim android.view.View#post
yöntemini kullanarak bitirmesini beklemekti . yani:
int myPosition = 0;
myFilterTabLayout.post(() -> { filterTabLayout.getTabAt(myPosition).select(); });
new Handler().postDelayed(()->{ tabLayout.post(() -> { tabLayout.getTabAt(myPosition).select(); }); },200);
Ben am parçalarını geçmek için TabLayout kullanarak. Programlı olarak bir sekme seçmeye çalıştığım zaman tab.select()
, benim TabLayout.OnTabSelectedListener
için onTabSelected(TabLayout.Tab tab)
çok fazla kedere neden olacak olan , tetikleyeceğim hariç, çoğunlukla işe yarar. Dinleyiciyi tetiklemeden programlı seçim yapmanın bir yolunu arıyordum.
Bu yüzden @kenodoggy'nin yanıtını kullanımım için uyarladım. (Ben yanıtlayan çünkü, henüz oluşturulmamış çünkü başka iç nesnelerin bazı return null verecek bir sorunla karşı karşıya olduğu onActivityResult()
daha önce ortaya çıkar benim parçası, gelen onCreate()
söz etkinliktir içinde singleTask
veya singleInstance
bir eğer ayrıntılı yukarı yazdım bu yüzden) / else hatası bildirecek ve bunlar olmadan düşecek NullPointerException
, aksi takdirde tetiklenecektir. Kayıt için Timber kullanıyorum, eğer onun yerine ile kullanmıyorsanız 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");
}
}
Burada tabLayout, XML'imdeki TabLayout
nesneye bağlı bellek değişkenimdir . Kaydırma sekmesi özelliğini kullanmıyorum, bu yüzden de kaldırdım.
viewPager.setCurrentItem () öğesini kullanmak için bir viewPager kullanmalısınız
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) {
}
});
görüntüleyiciniz için ekleyin:
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) {
}
});
// outofmemory kilitlenmesini önlemek için işleyici üzerinde
private void setViewPagerByIndex(final int index){
Application.getInstance().getHandler().post(new Runnable() {
@Override
public void run() {
viewPager.setCurrentItem(index);
}
});
}
İle TabLayout
sağladığı Malzeme Bileşenleri Kütüphanesi sadece kullanmak selectTab
yöntemi:
TabLayout tabLayout = findViewById(R.id.tab_layout);
tabLayout.selectTab(tabLayout.getTabAt(index));
1.1.0 sürümü gerekir.
Varsayılan olarak bir sekme seçerseniz, sekme vurgulanır. Açıkça seçmek istiyorsanız, onTabSelected (TabLayout.Tab sekmesi) altında verilen açıklamalı kodu belirtilen sekme dizini konumunuzla kullanmak anlamına gelir. Bu kod, viewpager'ı kullanarak sekme seçili pozisyonundaki parça değişimini açıklar.
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);
}
}
}
Bu da yardımcı olabilir
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) {
}
});
Öyleyse varsayılan sekmeniz ilk (0) olur ve bir parçaya geçerseniz, parçayı ilk kez manuel olarak değiştirmeniz gerekir. Bunun nedeni, sekmenin dinleyici kaydedilmeden önce seçilmesidir.
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;
}
Alternatif olarak, aşağıdaki şekilde arama getTabAt(0).select()
ve geçersiz kılmayı düşünebilirsiniz onTabReselected
:
@Override
public void onTabReselected(TabLayout.Tab tab) {
// Replace the corresponding tab fragment.
}
Bu işe yarayacaktır, çünkü esasen her sekme yeniden seçimindeki parçayı değiştiriyorsunuzdur.
TabLayout konumunu aşağıdaki işlevleri kullanarak ayarlayabilirsiniz
public void setTab(){
tabLayout.setScrollPosition(YOUR_SCROLL_INDEX,0,true);
tabLayout.setSelected(true);
}
Anlamada sorun yaşıyorsanız, bu kod size yardımcı olabilir
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
}
Bunu kodunuza da ekleyebilirsiniz:
myTabLayout.setTabTextColors(getColor(R.color.colorNormalTab),getColor(R.color.colorSelectedTab));
Bu şekilde dene.
tabLayout.setTabTextColors(getResources().getColor(R.color.colorHintTextLight),
getResources().getColor(R.color.colorPrimaryTextLight));
u ViewPager olmadan TabLayout kullanıyorsanız bu yardımcı olur
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) {
}
});
Kotlin Fix
viewPager.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));
sayfa görüntüleme kaydırma sayfası olarak sekmeyi seçer
TabLayout.Tab.select()
: "Bu sekmeyi seçin Yalnızca geçerli sekme işlem çubuğuna eklenmiş eğer.."