标签文本随viewpager消失

时间:2016-08-19 03:44:28

标签: android android-viewpager android-tablayout

一个非常简单的例子。我想大多数人都是以这种方式实现一个标签。但标签文本只是缺失。

设计支持lib的版本是最新的24.2.0。

这是我的布局代码:

<android.support.design.widget.TabLayout
    android:id="@+id/tabs"
    app:tabTextColor="@android:color/darker_gray"
    app:tabSelectedTextColor="@android:color/white"
    android:background="@color/colorPrimary"
    android:minHeight="?attr/actionBarSize"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.design.widget.TabItem
        android:text="@string/tab_domain"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <android.support.design.widget.TabItem
        android:text="@string/tab_upload"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <android.support.design.widget.TabItem
        android:text="@string/tab_download"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</android.support.design.widget.TabLayout>

<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

我使用ButterKnife 8.2.1绑定视图对象。这是我在onCreate()中的活动代码:

    final DiagnosePagerAdapter adapter = new DiagnosePagerAdapter(getSupportFragmentManager(),
            tabs.getTabCount());
    tabs.setupWithViewPager(pager);
    pager.setAdapter(adapter);
    pager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabs));

这是我的适配器:

    class DiagnosePagerAdapter extends FragmentStatePagerAdapter {
    int mNumOfTabs;
    List<Fragment> fragments = new ArrayList<>();

    public DiagnosePagerAdapter(FragmentManager fm, int numberOfTabs) {
        super(fm);
        this.mNumOfTabs = numberOfTabs;
        fragments.add(new DomainFragment());
        fragments.add(new UploadFragment());
        fragments.add(new DownloadFragment());
    }

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

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

我在这里看到了类似的问题:Using TabLayout inside a Fragment; tab text invisible

该问题的答案说这已在23.0.0中修复,并且我的手机上没有任何解决方法,包括小米HM 2A和华为设备。

4 个答案:

答案 0 :(得分:7)

您必须覆盖getPageTitle(),如下所示(我认为这将解决您的问题):

@Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0:
                return "Domain";
            case 1:
                return "Upload";
            case 2:
                return "Download";
        }
        return null;
    }

此外,由于您有固定数量的标签页,因此您应使用FragmentPagerAdapter代替FragmentStatePagerAdapter。然后更改您的xml布局如下:

<android.support.design.widget.TabLayout
    android:id="@+id/tabs"
    app:tabTextColor="@android:color/darker_gray"
    app:tabSelectedTextColor="@android:color/white"
    android:background="@color/colorPrimary"
    android:minHeight="?attr/actionBarSize"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

更改您的适配器,如下所示:

class DiagnosePagerAdapter extends FragmentPagerAdapter {

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

    @Override
    public Fragment getItem(int position) {
        Fragment fragment = null;
        switch (position) {
            case 0:
                fragment = new DomainFragment();
                break;
            case 1:
                fragment = new UploadFragment();
                break;
            case 2:
                fragment = new DownloadFragment();
                break;
        }
        return fragment;
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0:
                return "Domain";
            case 1:
                return "Upload";
            case 2:
                return "Download";
        }
        return null;
    }

}

并按以下方式更改onCreate()

final DiagnosePagerAdapter adapter = new DiagnosePagerAdapter(getSupportFragmentManager());
pager.setAdapter(adapter);//call setAdapter() before setupWithViewPager()
tabs.setupWithViewPager(pager);

答案 1 :(得分:0)

选项卡的文本被覆盖,因为Android不使用您在布局xml中定义的选项卡。而是创建了全新的标签页。

另一个答案已经说明了如何使用适配器添加文本。

但是,如果您想添加图标或使用“标签”进行其他操作,则必须在第一个创建的“片段”中执行以下操作。

public void onCreateView(...) {
    ...
    TabLayout tabLayout = getActivity().findViewById(R.id.tabLayout);
    PagerAdapter.setTitle(tabLayout);

然后在您的PagerAdapter中...

public static void setTitle(TabLayout tabLayout) {
    TabLayout.Tab tab;

    tab = tabLayout.getTabAt(0);
    tab.setIcon(R.drawable.home_icon);
    tab.setText(R.string.my);

    tab = tabLayout.getTabAt(1);
    tab.setIcon(R.drawable.icon_search);
    tab.setText(R.string.search);

    tab = tabLayout.getTabAt(2);
    tab.setIcon(R.drawable.icon_settings);
    tab.setText(R.string.settings);
}

Imo有点混乱,但Ive找不到其他方法。

答案 2 :(得分:0)

使 tablayout 可滚动为 true,以便它可以显示文本的完整名称。 作为参考,您可以使用以下代码。

 <androidx.viewpager.widget.ViewPager
    android:id="@+id/view_pager"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    app:layout_constraintTop_toBottomOf="@+id/tb_socialMedia_fragment">

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabInlineLabel="true"
        app:tabMode="scrollable"
        />
</androidx.viewpager.widget.ViewPager>

答案 3 :(得分:0)

如果您想将名称添加到 tablayout 并添加类,您可以使用以下代码

class SocialMediaVpAdapter(
    var fragmentManager: FragmentManager, var context :Context) : FragmentPagerAdapter(fragmentManager) {
    override fun getCount(): Int {
        return 4
    }

    override fun getPageTitle(position: Int): CharSequence? {
         return when (position) {
            0 -> {
                context.getString(R.string.social_all)
            }
            1 -> {
                context.getString(R.string.social_facebook)
            }
            2 -> {
                context.getString(R.string.social_Instagram)
            }
            3 ->{
                context.getString(R.string.social_tiktok)
            }

            else ->context.getString(R.string.social_all)
         }
    }

    override fun getItem(position: Int): Fragment {
        return when (position) {
            0 -> {
                AllSocialMedia()
            }
            1 -> {
                FbSocialMediaActivity()
            }
            2 -> {
                InstagramSocialMedia()
            }
            3 ->{
                TikTokSocialMedia()
            }

            else -> AllSocialMedia()
        }
    }
}