天道酬勤,学无止境

TabLayout 未在 Marshmallow 上显示选项卡标题(TabLayout not displaying tab title on Marshmallow)

问题

当我在棉花糖设备上测试我的应用程序时,我遇到了一个奇怪的问题,我的标签页标题没有显示。 当我在所有其他设备上测试它时,标题显示得很好。 在调试时,设备会遇到所有相同的点,包括我的适配器内的“getPageTitle”方法。 我已经阅读了许多使用 android 的 TabLayout 和 ViewPager 的教程,只是为了确保我没有遗漏任何东西,而且据我所知,我没有做错任何事情。

这是我主要活动中的代码,

// setup viewPager
final ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager);
setupViewPager(viewPager);

// setup tabLayout
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout);
tabLayout.setupWithViewPager(viewPager);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

我的 setUpViewPager() 方法,

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getFragmentManager());
    viewPager.setAdapter(adapter);
}

和我的适配器类,它扩展了 FragmentPagerAdapter

private class ViewPagerAdapter extends FragmentPagerAdapter {
    private static final int NUM_FRAGMENTS = 2;

    public ViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0: return AllFeaturesFragment.newInstance();
            case 1: return CategoriesFragment.newInstance();
        }
        return null;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0: return "All Features";
            case 1: return "Categories";
        }
        return null;
    }

    @Override
    public int getCount() {
        return NUM_FRAGMENTS;
    }
}

任何帮助是极大的赞赏!

编辑

我从来没有想过要检查 xml 文件以获得答案,但我在 TabLayout 元素上使用了一种样式,其父样式为“Widget.AppCompat.Toolbar”。 出于某种原因,这种风格使标题在棉花糖设备上不可见,而在其他设备上不可见。 我所要做的就是删除样式,它运行良好!

回答1

我也面临同样的问题。 问题是当您对寻呼机适配器内的标签图块进行硬编码时,支持库中存在一些问题。 我像这样改变了寻呼机适配器

 class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}
}

然后你可以像这样在活动中添加片段

public class MainActivity extends AppCompatActivity {

private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);

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

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new OneFragment(), "ONE");
    adapter.addFragment(new TwoFragment(), "TWO");
    adapter.addFragment(new ThreeFragment(), "THREE");
    viewPager.setAdapter(adapter);
}
}
回答2

代替

tabLayout.setupWithViewPager(viewPager);

viewPager.addOnPageChangeListener(
    new TabLayout.TabLayoutOnPageChangeListener(tabLayout)
);

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • TabLayout选项卡文本不显示(TabLayout tabs text not displaying)
    问题 我使用TabLayout一个内部Fragment显示三个固定标签和标签都工作,但它并不显示即使我设置了标签文本app:tabTextColor在它仍然是不可见的布局属性。 NewFragment.java public class NewFragment extends Fragment { private RecyclerView mRecyclerView; private RecyclerView.LayoutManager mLayoutManager; private RecyclerView.Adapter mAdapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View inflatedView = inflater.inflate(R.layout.new_fragment, container, false); TabLayout tabLayout = (TabLayout) inflatedView.findViewById(R.id.tabLayout); tabLayout.addTab(tabLayout.newTab().setText("Tab 1"))
  • Android支持设计TabLayout:重力中心和模式可滚动(Android Support Design TabLayout: Gravity Center and Mode Scrollable)
    问题 我正在尝试在项目中使用新的Design TabLayout。 我希望布局能够适应每种屏幕尺寸和方向,但是可以在一个方向上正确看到它。 我正在处理将我的tabLayout设置为Gravity和Mode的问题: tabLayout.setTabGravity(TabLayout.GRAVITY_CENTER); tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE); 因此,我希望如果没有空间,则tabLayout是可滚动的,但是如果有空间,则它将居中。 从指南: public static final int GRAVITY_CENTER用于在TabLayout中心布置选项卡的重力。 public static final int GRAVITY_FILL用于尽可能多地填充TabLayout的重力。 该选项仅在与MODE_FIXED一起使用时才生效。 public static final int MODE_FIXED固定选项卡同时显示所有选项卡,最好与可在选项卡之间快速旋转的内容一起使用。 选项卡的最大数量受视图宽度的限制。 固定制表符的宽度相等,基于最宽的制表符标签。 public static final int MODE_SCROLLABLE可滚动选项卡在任何给定时刻显示选项卡的子集,并且可以包含更长的选项卡标签和更大数量的选项卡
  • 如何在 TabLayout 内的选项卡上显示未读通知计数器?(How to show unread notification counter on Tabs inside TabLayout?)
    问题 我正在使用 android 支持设计库的 TabLayout。 我想在标签上显示未读通知计数器,标题如下图。 如何在TabLayout内的Tab上设置未读计数? 回答1 使用public TabLayout.Tab setCustomView (int layoutResId) 创建一个带有TextView和Button的Layout在自定义视图中使用它。 以供参考 设置自定义视图 例子 希望这对你有帮助。 回答2 看看android-viewbadger...
  • 带有自定义视图的 Tablayout 在 23.4.0 设计库上被破坏(Tablayout with Custom view Broken on 23.4.0 design lib)
    问题 我正在将 tablayout 设置为我的 viewpager 。 但是当我使用 notifyDataSetChanged 时,它会删除我的自定义视图并显示默认标题视图我的代码 ViewPager viewPager = findView(R.id.view_pager); ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager(), getResources(), getFragments()); viewPager.setAdapter(adapter); tabs.setupWithViewPager(viewPager); for (int i = 0; i < tabs.getTabCount(); i++) { TabLayout.Tab tab = tabs.getTabAt(i); tab.setCustomView(getTabView(i)); } t.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { adapter.notifyDataSetChanged(); } }); public View getTabView(int
  • 如何使用tablayout在viewpager中设置当前选项卡(How to set current tab in viewpager with tablayout)
    问题 我有一个使用 tablayout 的自定义 viewpager(由于原因禁用了滑动)。 内容根据选择的选项卡而变化。 我想使用 espresso 测试这个:1) 单击特定选项卡 2) 检查选项卡特定页面中的一些数据 我该怎么做。 我是浓缩咖啡的新手 回答1 有几种方法可以做到这一点,一个简单的方法是通过选项卡标题选择元素,我使用以下代码: Matcher<View> matcher = allOf(withText("TAB TITLE"), isDescendantOfA(withId(R.id.customTab))); onView(matcher).perform(click()); SystemClock.sleep(800); // Wait a little until the content is loaded 您只需要根据您的布局调整匹配器。 然后,检查内容。 例如: onView(withId(R.id.someId)).check(matches(isCompletelyDisplayed())); 或者: onView(withText(R.string.someText)).check(matches(isCompletelyDisplayed())); 您可以在指定视图匹配器部分中找到示例:http://developer.android.com
  • TabLayout选项卡标题文本(小写)(TabLayout Tab Title text in Lower Case)
    问题 我在Min SDK 15中的应用程序中使用了android.support.design.widget.TabLayout 。 默认情况下,它以大写形式显示Tab标题,但我希望它在“ textCapsWord”中显示。 我尝试按照此处和此处的建议添加样式。 但是不幸的是,两者都不起作用。 回答1 如果TabLayout添加到TabLayout它将正常工作: app:tabTextAppearance="@android:style/TextAppearance.Widget.TabWidget" 像这样使用它: <android.support.design.widget.TabLayout android:id="@+id/tabLayout" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabIndicatorColor="@android:color/white" app:tabIndicatorHeight="2dp" app:tabTextAppearance="@android:style/TextAppearance.Widget.TabWidget" app:tabSelectedTextColor="@android:color/white" app
  • 平板电脑设备上的标签页未完​​全显示[使用android.support.design.widget.TabLayout](Tab not taking full width on Tablet device [Using android.support.design.widget.TabLayout])
    问题 我有设置选项卡作为UPDATE 29/05/2015这篇文章。 在Nexus 4移动设备上,标签占据全角,但在nexus 7平板电脑上,标签占据中心,而不能覆盖整个屏幕宽度。 Nexus 7屏幕截图 Nexus 4屏幕截图 回答1 从Kaizie借来的“更简单”的答案将只是在TabLayout xml中添加app:tabMaxWidth="0dp" : <android.support.design.widget.TabLayout android:layout_width="match_parent" android:layout_height="wrap_content" app:tabMaxWidth="0dp" app:tabGravity="fill" app:tabMode="fixed" /> 回答2 我遇到了同样的问题,我检查了TabLayout样式,发现它的默认样式是Widget.Design.TabLayout ,它具有不同的实现(正常,横向和sw600dp)。 我们需要的是平板电脑(sw600dp),它具有以下实现: <style name="Widget.Design.TabLayout" parent="Base.Widget.Design.TabLayout"> <item name="tabGravity">center</item> <item
  • Android ViewPager 在 TabLayout 上显示视图(Android ViewPager displaying views on top of TabLayout)
    问题 我正在尝试在 TabLayout 中设置两个选项卡。 第一个选项卡是显示配置文件,第二个选项卡是显示活动。 我有 TabLayout 和 ViewPager 设置。 我还创建了将两个片段链接到 tablayout 所需的适配器。 当我在我的手机上运行它时,两个屏幕和选项卡会显示,但它们不会显示在选项卡区域内 - 它们覆盖了实际的选项卡。 我正在使用设计支持库 (v23.1.1) 我有一个带有片段区域的主活动文件,它根据用户想要做什么来改变视图。 我该怎么做才能让标签内容显示在标签内部而不是标签顶部? 这是我的代码: 编辑:这是 profile_fragment.xml 文件(这是我希望选项卡出现的地方): <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="Fragments.ProfileFragment">
  • 仅带有图标的布局(Tablayout with icons only)
    问题 我正在使用设计支持来创建选项卡。 我还将ViewPager用于可滑动选项卡。 现在,我不知道如何仅使用图标而不是标签中的文本。 我试图找出答案,但没有成功。 我的代码: Toolbar toolbar; private TabLayout tabLayout; private ViewPager viewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); viewPager = (ViewPager) findViewById(R.id.pager); setupViewPager(viewPager); setupTablayout(); } private void setupTablayout() { tabLayout = (TabLayout) findViewById(R.id.tabLayout); tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); tabLayout.setupWithViewPager(viewPager); } class MyPagerAdapter
  • 删除TabLayout中的换行符(Remove line break in TabLayout)
    问题 我刚刚将新的TabLayout组件添加到我的应用程序中。 您可能知道选项卡有两种不同的模式app:tabMode="scrollable"和app:tabMode="fixed" 。 当我使用app:tabMode="fixed" ,得到以下结果: 左侧和右侧没有边距/填充,但文本已包装。 但是当我使用app:tabMode="scrollable"我得到以下结果: 文本没有换行,但是右边有一个奇怪的空白,我无法摆脱它。 我还尝试将tabGravity设置为app:tabGravity="center"或app:tabGravity="fill" ,但未实现任何更改。 如果你们中任何一个聪明的男孩和女孩为我找到解决方案,那将是很好的。 干杯,卢卡斯 回答1 这里的一种解决方案是为每个选项卡增加自定义布局,这将使您对每个选项卡的外观有更多的控制。 这是通过setCustomView()方法完成的。 请注意,在不同的屏幕分辨率下它看起来会有所不同。 要使它在每台设备上看起来都很完美总是很困难,但是至少使用此方法可以为您提供更多的控制权,因为您可以针对不同的屏幕分辨率/尺寸使用不同的自定义布局xml文件。 一种方法是使字体大小尽可能大,而不会减少每个屏幕的大小。 我得到了一个简单的示例,它将每个选项卡中的文本限制为一行,但是在此简单示例中,它也使侧面选项卡中的长文本变为椭圆形
  • Android 选项卡布局:根据选项卡标题包装选项卡指示器宽度(Android Tab layout: Wrap tab indicator width with respect to tab title)
    问题 有什么方法可以根据选项卡标题来包装选项卡指示器宽度吗? 回答1 是的,可以将标签指示符包装为标题设置填充为 0 public void wrapTabIndicatorToTitle(TabLayout tabLayout, int externalMargin, int internalMargin) { View tabStrip = tabLayout.getChildAt(0); if (tabStrip instanceof ViewGroup) { ViewGroup tabStripGroup = (ViewGroup) tabStrip; int childCount = ((ViewGroup) tabStrip).getChildCount(); for (int i = 0; i < childCount; i++) { View tabView = tabStripGroup.getChildAt(i); //set minimum width to 0 for instead for small texts, indicator is not wrapped as expected tabView.setMinimumWidth(0); // set padding to 0 for wrapping indicator as title
  • 设计只有图标的支持库选项卡(Design support library tabs with only icons)
    问题 我正在使用设计支持库来创建选项卡。 默认情况下,它会创建带有文本的选项卡。 如何创建只有图标的选项卡? 如果它是当前选定的选项卡,我还想更改图标颜色。 回答1 使用它来填充 viewPager: public class SectionPagerAdapter extends FragmentPagerAdapter { public SectionPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { switch (position) { case 0: return mFragmentA; case 1: return mFragmentB; case 2: return mFragmentC; default: return null; } } @Override public int getCount() { return 3; } @Override public CharSequence getPageTitle(int position) { return ""; // This removes the title, as you wish } } 然后在 onCreateView 中: final TabLayout
  • 在android设计库TabLayout中选择时更改图标和标题颜色(Change icon and title color when selected in android design library TabLayout)
    问题 我正在使用设计库的TabLayout我想要实现的是 我已经尝试了很多教程,我可以通过自定义选项卡来实现它,但是在选择选项卡时发生了一个限制,我想更改文本颜色以及无法通过引用的图标图像到目前为止我读过的任何教程。 到目前为止,我已经通过在FragmentStatePagerAdapter添加它来尝试这个 public View getTabView(int position) { View tab = LayoutInflater.from(mContext).inflate(R.layout.tabbar_view, null); TextView tabText = (TextView) tab.findViewById(R.id.tabText); ImageView tabImage = (ImageView) tab.findViewById(R.id.tabImage); tabText.setText(mFragmentTitles.get(position)); tabImage.setBackgroundResource(mFragmentIcons.get(position)); if (position == 0) { tab.setSelected(true); } return tab; } 回答1 设计库已更新以匹配材料设计“带有图标和文本的选项卡
  • TabLayout 的选项卡未显示(Tabs of TabLayout not showing)
    问题 我有一个主要活动,它承载一个片段,它又承载一个 TabLayout(带有一个 ViewPager)。 显示了选项卡栏,但未显示选项卡本身。 这是我在主要活动中用于显示主机片段的代码: Fragment fragment = new BMITabsFragment(); FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).addToBackStack(Constants.BMI_TABS_FRAGMENT).commit(); 这是我的承载 TabLayout 的 Fragment,它是 BMITabsFragment (sa): public class BMITabsFragment extends Fragment { ... @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { mParam1 = getArguments().getString(ARG
  • 如何在 Android 的 TabLayout 中使选项卡标题向左对齐(How to make tab title alignment to left in TabLayout in Android)
    问题 在 TabLayout 中,我似乎无法将选项卡标题与左侧对齐。 目前,标题居中。 这是我想要实现的目标。 这就是我目前所拥有的。 我使用的代码如下: <android.support.design.widget.TabLayout android:id="@+id/tabs" app:tabGravity="fill" app:tabMode="fixed" app:tabTextColor="@color/white" app:tabSelectedTextColor="@color/white" app:tabIndicatorColor="@color/white" android:background="@color/slate_grey" android:layout_width="match_parent" android:layout_height="wrap_content"> </android.support.design.widget.TabLayout> 回答1 将app:tabMode="scrollable"到您的<TabLayout.../>并且不要忘记添加xmlns:app="http://schemas.android.com/apk/res-auto" 。 有关更多信息,请查看 https://developer.android.com
  • 如何更改TabLayout所选标签的图标颜色?(How do I change the color of icon of the selected tab of TabLayout?)
    问题 我使用的是TabLayout与ViewPager ,我想知道怎样才能最有效地改变在TabLayout所选标签的图标的颜色。 Google的Youtube应用程序是如何实现此功能的完美参考。 主页上有四个深灰色的图标。 选择特定选项卡后,该选项卡的图标变为白色。 没有任何第三方库,我怎么能达到同样的效果? 选择器显然是一种可能的解决方案。 但是在那种情况下,我将不得不同时找到图标的白色和灰色版本,然后在选项卡被选中或取消选中时切换图标。 我想知道是否有更有效的方法可以突出显示图标颜色或其他内容。 我在任何教程中都找不到。 编辑 我上面直接提到的解决方案要求每个选项卡的图标使用两个可绘制对象。 我想知道是否有一种方法可以通过编程为每个选项卡的图标使用一个drawable来实现。 回答1 我找到了一种容易的方法。 viewPager = (ViewPager) findViewById(R.id.viewpager); setupViewPager(viewPager); tabLayout = (TabLayout) findViewById(R.id.tabs); tabLayout.setupWithViewPager(viewPager); tabLayout.setOnTabSelectedListener( new TabLayout
  • 如何在选项卡之间更改 FloatingActionButton?(How to change FloatingActionButton between Tabs?)
    问题 我正在尝试将Google Design Support Library 中的FloatingActionButton实现到三个选项卡中的两个选项卡中,并且根据 Material Design Guidelines - FloatingActionButton 它说: 如果在多个横向屏幕上(例如在选项卡上)有一个浮动操作按钮,则在进入每个屏幕时,如果每个屏幕上包含的操作不同,则该按钮应该显示和隐藏。 如果操作相同,则按钮应保留在屏幕上(如有必要,并转换为新位置。) 如何为我的应用程序中的 FAB 按钮制作这种过渡或动画? 回答1 此功能当前未内置到 FloatingActionButton 中,因此您必须自己为其设置动画。 假设您的 FloatingActionButton 在您的主要活动中,请将以下功能添加到您的活动中。 int[] colorIntArray = {R.color.walking,R.color.running,R.color.biking,R.color.paddling,R.color.golfing}; int[] iconIntArray = {R.drawable.ic_walk_white,R.drawable.ic_run_white,R.drawable.ic_bike_white,R.drawable.ic_add_white,R
  • 当tabMode设置为'scrollable'时,TabLayout无法填充宽度(TabLayout not filling width when tabMode set to 'scrollable')
    问题 我已经将TabLayout (来自支持库v22.2.1)添加到我的Fragment中,如下所示: <android.support.design.widget.TabLayout android:id="@+id/tabs" style="@style/MyColorAccentTabLayout" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabMode="scrollable"/> 问题在于,当片段的方向为横向时(在片段的初始创建之前或之后), TabLayout与Fragment的宽度不匹配(是的,父对象的宽度也设置为match_parent )。 当屏幕宽度较小时(即并非所有选项卡都可以同时显示): 当屏幕宽度足够大以显示所有选项卡时(请参见右侧的空白区域): 如果我将tabMode更改为fixed, tabMode填充宽度,但制表符太小。 有什么合适的解决方案吗? 回答1 我想这是实现您想要的最简单的方法。 public class CustomTabLayout extends TabLayout { public CustomTabLayout(Context context) { super(context); } public
  • TabLayout 的不同 tabMode(Different tabMode for TabLayout)
    问题 我正在使用 ViewPager 和 TabLayout。 如果选项卡可以放置在显示 tabMode 上,它们必须是: app:tabMode="fixed" 别的 app:tabMode="scrollable" 我怎样才能做到这一点? 回答1 我不明白你的问题,但我可以帮助你,如果标签计数是静态的或固定的(你知道标签的数量)然后app:tabMode="fixed"如果标签计数是动态的(数据来自提要)然后app:tabMode="scrollable" 回答2 我们可以在 TabLayout 中使用两种 tabMode: app:tabMode="fixed" app:tabMode="scrollable" 并且以编程方式就像 tabLayout.setTabMode(TabLayout. MODE_FIXED); tabLayout.setTabMode(TabLayout. MODE_SCROLLABLE); 以上与 MODE_SCROLLABLE 相同 要了解 TabLayout 模式,您可以参考以下链接 https://developer.android.com/reference/android/support/design/widget/TabLayout 回答3 在xml布局中,我声明 固定的 在片段 java 类中,我做了这个: if (tabLayout
  • TabLayout 的不同 tabMode(Different tabMode for TabLayout)
    问题 我正在使用 ViewPager 和 TabLayout。 如果选项卡可以放置在显示 tabMode 上,它们必须是: app:tabMode="fixed" 别的 app:tabMode="scrollable" 我怎样才能做到这一点? 回答1 我不明白你的问题,但我可以帮助你,如果标签计数是静态的或固定的(你知道标签的数量)然后app:tabMode="fixed"如果标签计数是动态的(数据来自提要)然后app:tabMode="scrollable" 回答2 我们可以在 TabLayout 中使用两种 tabMode: app:tabMode="fixed" app:tabMode="scrollable" 并且以编程方式就像 tabLayout.setTabMode(TabLayout. MODE_FIXED); tabLayout.setTabMode(TabLayout. MODE_SCROLLABLE); 以上与 MODE_SCROLLABLE 相同 要了解 TabLayout 模式,您可以参考以下链接 https://developer.android.com/reference/android/support/design/widget/TabLayout 回答3 在xml布局中,我声明 固定的 在片段 java 类中,我做了这个: if (tabLayout