在片段内使用TabLayout; 标签文字不可见

我正在尝试新的Android支持devise库中的各种新组件。 我在我的MainActivity.java实现了一个NavigationView ,它使用FragmentManager在Navigation抽屉中的项目之间导航:

 getSupportFragmentManager() .beginTransaction() .replace(R.id.content, mTabLayoutFragment) .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) .commit(); 

我在一个片段中使用TabLayout 。 这是片段的布局:

 <android.support.design.widget.AppBarLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.TabLayout android:id="@+id/tabLayout" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabMode="fixed" app:tabGravity="fill" app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/white"/> </android.support.design.widget.AppBarLayout> 

和它背后的Java代码:

 import android.os.Bundle; import android.support.design.widget.*; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class TabLayoutFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View inflatedView = inflater.inflate(R.layout.fragment_tablayout, container, false); TabLayout tabLayout = (TabLayout) inflatedView.findViewById(R.id.tabLayout); tabLayout.addTab(tabLayout.newTab().setText("Campusplan")); tabLayout.addTab(tabLayout.newTab().setText("Raumplan")); final ViewPager viewPager = (ViewPager) inflatedView.findViewById(R.id.viewpager); viewPager.setAdapter(new PagerAdapter (getFragmentManager(), tabLayout.getTabCount())); viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 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) { } }); return inflatedView; } public class PagerAdapter extends FragmentStatePagerAdapter { int mNumOfTabs; public PagerAdapter(FragmentManager fm, int NumOfTabs) { super(fm); this.mNumOfTabs = NumOfTabs; } @Override public Fragment getItem(int position) { switch (position) { case 0: TabItem1 tab1 = new TabItem1(); return tab1; case 1: TabItem1 tab2 = new TabItem1(); return tab2; default: return null; } } @Override public int getCount() { return mNumOfTabs; } } } 

请注意TabItem1TabItem1 ,它们是除了TextView之外什么都没有的片段。 这两个要在TabLayout中显示。

现在,这个代码似乎在某种程度上起作用了。 以下是它的样子:

有什么奇怪的是,我旋转设备后,似乎一切正常工作:

在这里输入图像说明

似乎有些东西被调用configuration更改。 这很奇怪,特别是考虑到我在AndroidManifest有以下几点:

 android:configChanges="orientation|screenSize" 

Related of "在片段内使用TabLayout; 标签文字不可见"

我面临与新版本的android支持Design Library v23.1.1相同的问题。 但是我只是想知道发生了什么。

如果你的视图分页器有2个片段,那么你可以使用下面的语句来设置视图分页器:

 tabLayout.setupWithViewPager(viewPager); 

自动你将有2个标签与空文本。 所以你不应该再添加新的标签 。 但是你必须做的是在这两个创build的标签中设置文本。

 tabLayout.getTabAt(0).setText("Campusplan"); tabLayout.getTabAt(1).setText("Raumplan"); 

结论 。 要使制表符按您的要求工作,您必须做的重要事情:

 tabLayout.setupWithViewPager(viewPager); tabLayout.getTabAt(0).setText("Campusplan"); tabLayout.getTabAt(1).setText("Raumplan"); 

我希望这会对你有所帮助:)

更新:devise库v23.0.0解决了这个问题。


发现问题在这里: https : //code.google.com/p/android/issues/detail?id=180462

简单的解决方法:

 tabLayout.post(new Runnable() { @Override public void run() { tabLayout.setupWithViewPager(viewPager); } }); 

只是试图覆盖适配器中的方法:

public CharSequence getPageTitle(int position) {}

它的工作。

在这个图书馆工作的开发人员推荐以下工作:

 if (ViewCompat.isLaidOut(tabLayout)) { tabLayout.setupWithViewPager(viewPager); } else { tabLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { tabLayout.setupWithViewPager(viewPager); tabLayout.removeOnLayoutChangeListener(this); } }); } 

缺乏评论@arif ardiansyah …

检查源代码:

  `TabLayout#setupWithViewPager(...)` -->>`setPagerAdapter(adapter, true);` -->>`populateFromPagerAdapter();` 

在这里, TabLayout删除所有选项卡,并重新创build一些新的选项卡,其文本使用PagerAdapter#getPageTitle(...) 。 所以你可以重写这个方法来为Tablayout提供标签的标题。