简体   繁体   English

TabLayout 上的标签标题未显示

[英]Tabs titles on TabLayout not showing

Update: I modified my adapter class to the following, and it works fine now:更新:我将我的适配器 class 修改为以下内容,现在可以正常工作:

public class SectionsPagerAdapter extends FragmentPagerAdapter {
R.string.tab_text_2, R.string.tab_text_3};
    //private final Context mContext;
    private static int tab_count;
    private Context mContext;

    public SectionsPagerAdapter(FragmentManager fm, int tab_count, Context context) {
        super(fm);
        mContext = context;
        this.tab_count = tab_count;
    }

    @Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        // Return a PlaceholderFragment (defined as a static inner class below).
        //return PlaceholderFragment.newInstance(position + 1);
        switch (position)
        {
            case 0:
                Tab1Pagina_Inicial tab1 = new Tab1Pagina_Inicial();
                return tab1;

            case 1:
                Tab2Apartamentos tab2 = new Tab2Apartamentos();
                return tab2;

            case 2:
                Tab3ItensDeApartamentos tab3 = new Tab3ItensDeApartamentos();
                return tab3;

             default:
                 return null;
        }
    }

    @Override
    public CharSequence getPageTitle(int position) {
        switch (position)
        {
            case 0:
                return mContext.getString(R.string.tab_text_1);
            case 1:
                return mContext.getString(R.string.tab_text_2);
            case 2:
                return mContext.getString(R.string.tab_text_3);
            default:
                return null;
        }
    }

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

Adding the getPageTitle worked.添加 getPageTitle 有效。 Thank you for the tips.感谢您的小费。 ^^ ^^

I'm creating an app with a tab menu but the tabs' titles are not displaying properly.我正在创建一个带有选项卡菜单的应用程序,但选项卡的标题显示不正确。 I've tried rereading and looking again at every tutorial I've seen so far, as well as comparing my code to others with similar questions here on stackoverflow but I still can't seem to identify what I'm doing wrong and where.我已经尝试重新阅读并再次查看到目前为止我看到的每个教程,以及将我的代码与其他在 stackoverflow 上存在类似问题的代码进行比较,但我似乎仍然无法确定我做错了什么以及在哪里做错了。 Could anyone enlighten me as to my mistake?谁能告诉我我的错误?

Thank you in advance for any clarification.提前感谢您的任何澄清。

Edit: I don't think it's the color.编辑:我不认为这是颜色。 I've tried messing with the colors and themes of both TabLayout, AppBarLayout and each tab item separately (as well as removing the themes altogether) and the titles are still not showing like they should.我试过弄乱 colors 和 TabLayout、AppBarLayout 和每个选项卡项目的主题(以及完全删除主题),但标题仍然没有像应有的那样显示。 But I'll post the code for my colors.xml and styles.xml files just in case.但我会发布我的 colors.xml 和 styles.Z0F635D0E10F3874CFF88B 文件中的代码。

Edit 2: Guys, I've found out something curious.编辑2:伙计们,我发现了一些奇怪的东西。 Now I'm not sure I really understand TabLayout as I thought I did.现在我不确定我是否真的像我想的那样理解 TabLayout。 Before I set my TabLayout with my ViewPager with the setupWithViewPager method, everything appears as it should.在我使用 setupWithViewPager 方法将我的 TabLayout 设置为 ViewPager 之前,一切都会按原样显示。 The titles show up I mean.我的意思是,标题出现了。 But I can only actually change tabs by swiping.但我实际上只能通过滑动来更改标签。 Clicking on each tab does nothing.单击每个选项卡不会执行任何操作。 I'll attach an image to show what I mean.我会附上一张图片来说明我的意思。

Here's what I thought I understood: I know I need an adapter to render each fragment as content for each tab.以下是我认为我理解的内容:我知道我需要一个适配器来将每个片段呈现为每个选项卡的内容。 I know the ViewPager is the component responsible for the swiping between tabs.我知道 ViewPager 是负责在选项卡之间滑动的组件。 TabLayout is a layout where I can display my tabs. TabLayout 是一种布局,我可以在其中显示我的选项卡。 I need to hook my TabLayout to my ViewPager in order to display the correct content whenever I click a specific tab.我需要将 TabLayout 连接到 ViewPager,以便在单击特定选项卡时显示正确的内容。

Am I missing something?我错过了什么吗?

MainActivity:主要活动:

package com.example.pousadaviladascores.Activities;

import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;
import android.os.Bundle;
import com.example.pousadaviladascores.DAO.SqlAccess;
import com.example.pousadaviladascores.UI.SectionsPagerAdapter;
import com.example.pousadaviladascores.R;
import com.google.android.material.tabs.TabLayout;

public class MainActivity extends AppCompatActivity {

    SqlAccess sqlAccess;

    //Declaring TabLayout and ViewPager
    TabLayout tabLayout;
    ViewPager viewPager;

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

        sqlAccess = new SqlAccess(this);

        //Initializing TabLayout
        tabLayout = findViewById(R.id.tabLayout);

        //Initializing viewPager
        viewPager = findViewById(R.id.view_pager);

        //Initializing page adapter
        //OBS: In Android, Adapter is a bridge between UI component and data source that helps us to fill data in UI component.
        SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());

        //Sets a PagerAdapter that will supply views for this pager as needed
        viewPager.setAdapter(sectionsPagerAdapter);

        tabLayout.setupWithViewPager(viewPager);

    }

    @Override
    protected void onDestroy() {
        sqlAccess.getDbHelper().close();
        super.onDestroy();
    }
}

Fragment class (I have three classes, one for each fragment and they all have the same code, so I'm just posting one):片段 class (我有三个类,每个片段一个,它们都有相同的代码,所以我只发布一个):

package com.example.pousadaviladascores.Activities;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.fragment.app.Fragment;

import com.example.pousadaviladascores.R;

public class Tab1Pagina_Inicial extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        return inflater.inflate(R.layout.tab1_fragment_pagina_inicial, container, false);
    }
}

Page Adapter class:页面适配器 class:

package com.example.pousadaviladascores.UI;

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;

import com.example.pousadaviladascores.Activities.Tab1Pagina_Inicial;
import com.example.pousadaviladascores.Activities.Tab2Apartamentos;
import com.example.pousadaviladascores.Activities.Tab3ItensDeApartamentos;

/**
 * A [FragmentPagerAdapter] that returns a fragment corresponding to
 * one of the sections/tabs/pages.
 */
public class SectionsPagerAdapter extends FragmentPagerAdapter {

    private static int tab_count;

    public SectionsPagerAdapter(FragmentManager fm, int tab_count) {
        super(fm);
        //mContext = context;
        this.tab_count = tab_count;
    }

    @Override
    public Fragment getItem(int position) {
        switch (position)
        {
            case 0:
                Tab1Pagina_Inicial tab1 = new Tab1Pagina_Inicial();
                return tab1;

            case 1:
                Tab2Apartamentos tab2 = new Tab2Apartamentos();
                return tab2;

            case 2:
                Tab3ItensDeApartamentos tab3 = new Tab3ItensDeApartamentos();
                return tab3;

             default:
                 return null;
        }
    }

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

activity_main.xml: activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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">

    <com.google.android.material.appbar.AppBarLayout
        android:id="@+id/appBarLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <TextView
            android:id="@+id/textViewAppName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingLeft="20dp"
            android:paddingTop="5dp"
            android:paddingRight="20dp"
            android:text="@string/pousada_name"
            android:textSize="24sp" />

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="34dp"
            android:theme="?attr/actionBarTheme"
            app:layout_scrollFlags="scroll|enterAlways" />

        <com.google.android.material.tabs.TabLayout
            android:id="@+id/tabLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabMode="fixed">

            <com.google.android.material.tabs.TabItem
                android:id="@+id/tab1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/tab_text_1" />

            <com.google.android.material.tabs.TabItem
                android:id="@+id/tab2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/tab_text_2" />

            <com.google.android.material.tabs.TabItem
                android:id="@+id/tab3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/tab_text_3" />
        </com.google.android.material.tabs.TabLayout>
    </com.google.android.material.appbar.AppBarLayout>

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

Tab layout (again, all the same except for the text):选项卡布局(同样,除了文本之外都一样):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textTab"
        android:layout_width="369dp"
        android:layout_height="54dp"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true"
        android:layout_marginStart="27dp"
        android:layout_marginLeft="27dp"
        android:layout_marginTop="0dp"
        android:layout_marginEnd="15dp"
        android:text="@string/tab_text_1"
        android:textSize="30sp"
        android:layout_alignParentRight="true"
        android:layout_marginRight="15dp" />

</RelativeLayout>

colors.xml: colors.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#008577</color>
    <color name="colorPrimaryDark">#00574B</color>
    <color name="colorAccent">#D81B60</color>
</resources>

styles.xml: styles.xml:

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

    <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

    <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />

</resources>

To better illustrate what I mean, here's the design of activity_main and how it's supposed to look:为了更好地说明我的意思,这里是 activity_main 的设计以及它的外观:

Here's what's actually happening:这是实际发生的事情: 在此处输入图像描述

在此处输入图像描述 在此处输入图像描述

The text for each page shows up fine, but not the titles.每页的文字显示得很好,但标题却没有。 :/ :/

Activity main活动主体

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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">

    <com.google.android.material.appbar.AppBarLayout
        android:id="@+id/appBarLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <TextView
            android:id="@+id/textViewAppName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingLeft="20dp"
            android:paddingTop="5dp"
            android:paddingRight="20dp"
            android:text="@string/pousada_name"
            android:textSize="24sp" />

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="34dp"
            android:theme="?attr/actionBarTheme"
            app:layout_scrollFlags="scroll|enterAlways" />

        <com.google.android.material.tabs.TabLayout
            android:id="@+id/tabLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabMode="fixed"
            app:tabGravity="fill"/>
    </com.google.android.material.appbar.AppBarLayout>

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

Your main activity你的主要活动

public class MainActivity extends AppCompatActivity {

    SqlAccess sqlAccess;

    //Declaring TabLayout and ViewPager
    TabLayout tabLayout;
    ViewPager viewPager;

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

        sqlAccess = new SqlAccess(this);

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

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

    }
 private void setupViewPager(ViewPager viewPager) {
        SectionsPagerAdapter adapter = new SectionsPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new Tab1Pagina_Inicial(), "ONE");
        adapter.addFragment(new Tab2Apartamentos(), "TWO");
        adapter.addFragment(new Tab3ItensDeApartamentos(), "THREE");
        viewPager.setAdapter(adapter);
    }

    @Override
    protected void onDestroy() {
        sqlAccess.getDbHelper().close();
        super.onDestroy();
    }
}

And replace your section pager adapter with this并用这个替换你的部分寻呼机适配器

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

        public SectionPagerAdapter(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);
        }
    }

in activity_main.xml , remove android:theme="@style/AppTheme.AppBarOverlay from appbarlayout() . i think text color problem. it is the same color as appbar . so it is not showing. if you change your theme probably your text will be appeared.activity_main.xml中,从appbarlayout()中删除android:theme="@style/AppTheme.AppBarOverlay 。我认为文本颜色问题。它与appbar的颜色相同。所以它没有显示。如果你改变你的主题可能是你的文本会出现。

There are 2 issues.有2个问题。

The method tabLayout.setupWithViewPager() removes all tabs and then adds tabs from the adapted using: addTab(newTab().setText(pagerAdapter.getPageTitle(i)), false); tabLayout.setupWithViewPager()方法删除所有选项卡,然后从改编的选项卡中添加选项卡,使用: addTab(newTab().setText(pagerAdapter.getPageTitle(i)), false);

You have to override in your adapter the method getPageTitle to obtain the title string.您必须在适配器中覆盖getPageTitle方法以获取标题字符串。 The default value is null .默认值为null Something like:就像是:

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

Also to use the com.google.android.material.tabs.TabLayout you have to use a Material Components Theme in your app.此外,要使用com.google.android.material.tabs.TabLayout ,您必须在应用程序中使用Material Components Theme You are using an AppCompat theme.您正在使用 AppCompat 主题。

You can:你可以:

  • switch to a Material Components theme (suggested and required in the next releases)切换到 Material Components 主题(在下一版本中建议和要求)
  • add app:tabTextColor attribute:添加app:tabTextColor属性:
  <com.google.android.material.tabs.TabLayout
      app:tabTextColor="@color/mySelector"
      .../>
  • define the style:定义样式:
  <com.google.android.material.tabs.TabLayout
      style="@style/Widget.MaterialComponents.TabLayout"

The default style used by the TabLayout in a Material Component theme is Widget.MaterialComponents.TabLayout while in an AppCompat is Widget.Design.TabLayout在 Material Component 主题中 TabLayout 使用的默认样式是Widget.MaterialComponents.TabLayout而在 AppCompat 中是Widget.Design.TabLayout

There are some difference, in your case it is the issue:有一些区别,就您而言,这是问题所在:

<style name="Widget.Design.TabLayout" >
  <item name="tabIndicatorColor">?attr/colorAccent</item>
  <item name="tabTextColor">@null</item>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM