我想建立一个TabLayout。当我在XML中或编程中添加TabItems时,它们占据空间,可以单击,但它们的文本不显示。当我在OnTabSelectedListener中通过tab.getText()编程访问他们的文本时,它就在那里了。
当我想用传呼机的时候,也发生了同样的事情。
我知道,那
TabItem实际上不是添加到TabLayout中的,它只是一个允许设置选项卡项的文本、图标和自定义布局的虚拟
但我不知道如何在屏幕上显示它的文字。
AndroidStudio的设计显示了预期的布局。
我用Java编写应用程序。
.xml:
<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中的外观:
它在应用程序中的外观:
请帮忙材料快把我逼疯了
发布于 2021-02-21 00:07:08
这可以通过编程方式解决。
步骤1创建FragmentStateAdapter
适配器类
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;
}
}
步骤2在activity
或fragment
类中创建一个方法,使用TabLayoutMediator
设置选项卡,并在onCreate
方法中调用该方法
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();
}
这就是您的活动类的样子。
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
文件中。
android{
...
buildFeatures {
viewBinding true
}
...
}
activity_main.xml
<?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.java
、MyExerciseFragment.java
和ExerciseFragment
。
发布于 2021-02-21 18:42:25
因为我不想使用带有片段的寻呼机,并且无法让TabLayout工作,所以我创建了自己的TabLayout。
我将LinearLayout与TextViews结合使用,只绘制了底部的一行和适当的backgroundColor。它工作得完美无缺,唯一缺少的就是线条运动的动画。
每次单击后,恢复先前选择的textView的外观,并更改新的。
<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
<?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>
背景变化:
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;
}
https://stackoverflow.com/questions/66296471
复制相似问题