首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >安卓材料TabLayout TabItem不显示文本

安卓材料TabLayout TabItem不显示文本
EN

Stack Overflow用户
提问于 2021-02-20 20:56:53
回答 2查看 1.2K关注 0票数 0

我想建立一个TabLayout。当我在XML中或编程中添加TabItems时,它们占据空间,可以单击,但它们的文本不显示。当我在OnTabSelectedListener中通过tab.getText()编程访问他们的文本时,它就在那里了。

当我想用传呼机的时候,也发生了同样的事情。

我知道,那

TabItem实际上不是添加到TabLayout中的,它只是一个允许设置选项卡项的文本、图标和自定义布局的虚拟

但我不知道如何在屏幕上显示它的文字。

AndroidStudio的设计显示了预期的布局。

我用Java编写应用程序。

.xml:

代码语言:javascript
运行
复制
<com.google.android.material.tabs.TabLayout
    android:id="@+id/exercise_menu_tabLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/colorSurfaceElevation1dp"
    app:tabMode="fixed"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toTopOf="parent">

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

    <com.google.android.material.tabs.TabItem
        android:id="@+id/exercise_menu_myExercisesTabItem"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="My Exercises"/>

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

</com.google.android.material.tabs.TabLayout>

它在AndroidStudio中的外观:

它在AndroidStudio中的样子

它在应用程序中的外观:

它在应用程序中的外观

请帮忙材料快把我逼疯了

EN

回答 2

Stack Overflow用户

发布于 2021-02-21 00:07:08

这可以通过编程方式解决。

步骤1创建FragmentStateAdapter适配器类

代码语言:javascript
运行
复制
public class TabAdapter extends FragmentStateAdapter {

    public TabAdapter(@NonNull FragmentActivity fragmentActivity) {
        super(fragmentActivity);
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {

        switch (position) {
            case 0:
                return new DayFragment();
            case 1:
                return new MyExerciseFragment();
            default:
                return new ExerciseFragment();
        }
    }

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

步骤2activityfragment类中创建一个方法,使用TabLayoutMediator设置选项卡,并在onCreate方法中调用该方法

代码语言:javascript
运行
复制
void setupTabLayout() {
        ViewPager2 viewPager = binding.exerciseMenuViewPager;
        
        viewPager.setAdapter(tabAdapter);

        TabLayout tabLayout = binding.exerciseMenuTabLayout;

        new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> {
            switch (position) {
                case 0:
                    tab.setText("Day");
                    break;
                case 1:
                    tab.setText("My Exercise");
                    break;
                default:
                    tab.setText("Exercise");
            }
        }).attach();
    }

这就是您的活动类的样子。

代码语言:javascript
运行
复制
public class MainActivity extends AppCompatActivity {


    private ActivityMainBinding binding;
    private TabAdapter tabAdapter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        tabAdapter = new TabAdapter(this);

        setupTabLayout();
    }

    void setupTabLayout() {}
}

注意:使用ViewBinding将此代码添加到应用程序级别的build.gradle文件中。

代码语言:javascript
运行
复制
android{
    
    ...
     buildFeatures {
        viewBinding true
    }
    ...
}

activity_main.xml

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".MainActivity">

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/exercise_menu_tabLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/exercise_menu_viewPager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@id/exercise_menu_tabLayout" />

</androidx.constraintlayout.widget.ConstraintLayout>

最终结果

PS:您需要创建这些片段类DayFragment.javaMyExerciseFragment.javaExerciseFragment

票数 0
EN

Stack Overflow用户

发布于 2021-02-21 18:42:25

因为我不想使用带有片段的寻呼机,并且无法让TabLayout工作,所以我创建了自己的TabLayout。

我将LinearLayout与TextViews结合使用,只绘制了底部的一行和适当的backgroundColor。它工作得完美无缺,唯一缺少的就是线条运动的动画。

每次单击后,恢复先前选择的textView的外观,并更改新的。

代码语言:javascript
运行
复制
<TextView
    android:id="@+id/exercise_menu_dayTextView"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="Day"
    android:textAlignment="center"
    android:layout_weight="1"
    android:textSize="18sp"
    android:textStyle="bold|italic"
    android:textColor="@color/textColor"
    android:background="@color/colorSurfaceElevation1dp"
    android:paddingVertical="8dp"/>

<TextView
    android:id="@+id/exercise_menu_myExercisesTextView"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="My Exercises"
    android:textAlignment="center"
    android:layout_weight="1"
    android:textSize="18sp"
    android:textStyle="bold|italic"
    android:textColor="?attr/colorPrimary"
    android:maxLines="1"
    android:background="@drawable/back_line_bottom"
    android:paddingVertical="8dp"/>

<TextView
    android:id="@+id/exercise_menu_exerciseTextView"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="Exercises"
    android:textAlignment="center"
    android:layout_weight="1"
    android:textSize="18sp"
    android:textStyle="bold|italic"
    android:textColor="@color/textColor"
    android:background="@color/colorSurfaceElevation1dp"
    android:paddingVertical="8dp"/>

back_line_bottom.xml

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/colorPrimary"/>
        </shape>
    </item>
    <item android:bottom="2dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/colorSurfaceElevation1dp"/>
        </shape>
    </item>
</layer-list>

背景变化:

代码语言:javascript
运行
复制
public void changeTypeVisually(int tabId) {
    //  Resets the background
    switch(currentTabId) {
        case 0:
            myExercisesTextView.setBackgroundColor(getResources().getColor(R.color.colorSurfaceElevation1dp));
            myExercisesTextView.setTextColor(getResources().getColor(R.color.textColor));
            break;
        case 1:
            dayTextView.setBackgroundColor(getResources().getColor(R.color.colorSurfaceElevation1dp));
            dayTextView.setTextColor(getResources().getColor(R.color.textColor));
            break;
        case 2:
            exerciseTextView.setBackgroundColor(getResources().getColor(R.color.colorSurfaceElevation1dp));
            exerciseTextView.setTextColor(getResources().getColor(R.color.textColor));
            break;
    }

    //  Adds the underline
    switch(tabId) {
        case 0:
            myExercisesTextView.setBackground(getResources().getDrawable(R.drawable.back_line_bottom));
            myExercisesTextView.setTextColor(getResources().getColor(R.color.colorPrimary));
            break;
        case 1:
            dayTextView.setBackground(getResources().getDrawable(R.drawable.back_line_bottom));
            dayTextView.setTextColor(getResources().getColor(R.color.colorPrimary));
            break;
        case 2:
            exerciseTextView.setBackground(getResources().getDrawable(R.drawable.back_line_bottom));
            exerciseTextView.setTextColor(getResources().getColor(R.color.colorPrimary));
            break;
    }
    currentTabId = tabId;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66296471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档