版权声明
本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/11039643.html
前言
Tablayout一般做主页底下的导航栏开发或者上面的选择栏开发,就个人感觉Tablayout用于主页导航栏会比BottomNavigationView更好,自定义方面也更容易.缺点是没有动画也不是Material Design设计模式的一部分.下面就讲解用于有导航栏的主页开发:
一般主页导航栏与内容用Tablayout与Fragment配合使用
1.第一种Tablayout + ViewPager + Fragment, 好处是可以左右滑动不需要自己实现滑动,并且可以有动画出现
2.第二种Tablayout + Fragment, 如果你不需要左右滑动就可以轻松的选择这个模式.
在xml里
因为有2种添加Item的方式,所以写法也可以是2个种
第一种,这种方法可以直接配置Item的名称属性,注意!这种方法还可以设置图标android:icon=
<com.google.android.material.tabs.TabLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <com.google.android.material.tabs.TabItem android:layout_width="wrap_content" android:layout_height="wrap_content" /> <com.google.android.material.tabs.TabItem android:layout_width="wrap_content" android:layout_height="wrap_content" /> </com.google.android.material.tabs.TabLayout>
第二种,这种需要自己在代码里添加子Item,并且可以实现自定义布局和View的Item(下面会说明在代码里添加Item)
<com.google.android.material.tabs.TabLayout android:id="@+id/tablayout" android:layout_width="0dp" android:layout_height="56dp" app:tabIndicatorHeight="0dp" app:tabBackground="@android:color/transparent" app:tabRippleColor="@android:color/transparent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent"> </com.google.android.material.tabs.TabLayout>
需要自定义Item(下面用创建Tab的方式添加到TabLayout里,就前面说的代码里添加Item)
private void addTabData() { mTablayout = findViewById(R.id.tablayout); String[] tabContentArray = {"首页", "通知", "圈子", "我的"}; int[] tabIconArray = {R.drawable.ic_home_homepage, R.drawable.ic_home_notice, R.drawable.ic_home_circle, R.drawable.ic_home_my}; for (int i = 0; i < 4; i++) { TabLayout.Tab tab = mTablayout.newTab();//关键的创建一个Tab,注意这里使用的是已经实例的mTablayout创建的Tab,很容易疏忽使用new Tablayout().new Tab()的方式创建,这个是会报错的. View view = LayoutInflater.from(this).inflate(R.layout.home_tab_item,mTablayout,false); ImageView icon = view.findViewById(R.id.icon); TextView content = view.findViewById(R.id.content); icon.setImageResource(tabIconArray[i]); content.setText(tabContentArray[i]); tab.setCustomView(view); if (i == 0){ mTablayout.addTab(tab,0,true);//设置选择的item }else { mTablayout.addTab(tab); } } }
home_tab_item.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" android:orientation="vertical" android:layout_width="35dp" android:layout_height="wrap_content"> <TextView android:id="@+id/red_dot" android:layout_width="10dp" android:layout_height="10dp" android:background="@drawable/bg_reddot" app:layout_constraintTop_toTopOf="@id/icon" app:layout_constraintLeft_toRightOf="@id/icon" app:layout_constraintRight_toRightOf="@id/icon"/> <ImageView android:id="@+id/icon" android:layout_width="24dp" android:layout_height="24dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent"/> <TextView android:id="@+id/content" android:textColor="@color/fontColorMain2" android:textSize="@dimen/font_size_11" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="2dp" app:layout_constraintTop_toBottomOf="@id/icon" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent"/> </androidx.constraintlayout.widget.ConstraintLayout>
ic_home_homepage.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="true" android:drawable="@mipmap/ic_home_page_select"/> <item android:state_selected="false" android:drawable="@mipmap/ic_home_page"/> </selector>
Tablayout选中回调
private void initTablayoutListener(){ mTablayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { //选中某个tab } @Override public void onTabUnselected(TabLayout.Tab tab) { //当tab从选择到未选择 } @Override public void onTabReselected(TabLayout.Tab tab) { //已经选中tab后的重复点击tab } }); }
选中指定item
在代码里选中某一个TabItem,从select()方法就可以看出.就是希望你使用select()方法来切换item
mTabLayout.getTabAt(0).select();
设置Tab的TextSize
首先你需要在styles.xml文件里创建这个文字属性的styles
<style name="TabLayoutTextStyle"> <item name="android:textSize">@dimen/font_size_16</item> </style>
然后在使用以下属性导入styles
app:tabTextAppearance="@style/TabLayoutTextStyle"
如果你不需要选中下划线,可以使用这个属性取消
app:tabIndicatorHeight="0dp"
如果你不需要点击后的阴影加涟漪动画效果,可以使用下面2个属性取消
app:tabBackground="@android:color/transparent"
app:tabRippleColor="@android:color/transparent"
指示线的颜色
app:tabIndicatorColor
指示线的高度
app:tabIndicatorHeight
指示线是否铺满整个tab宽度,可以配合实现圆角
app:tabIndicatorFullWidth="false"
Tab选中时的字体颜色
app:tabSelectedTextColor
未选中字体颜色
app:tabTextColor="@color/colorPrimary"
设置背景颜色与选中背景颜色
背景颜色
app:tabBackground="color"
选中背景颜色
背景xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_selected="true"> <shape android:shape="rectangle"> <solid android:color="@color/snakecommon_color_181B23"/> </shape> </item> <item android:state_selected="false"> <shape android:shape="rectangle"> <solid android:color="@color/snakecommon_color_000000"/> </shape> </item> </selector>
使用
app:tabBackground="@drawable/snake_tuya_shape_rectangle_000000"
是否可以滚动
app:tabMode="scrollable" : 默认是fixed,固定的;scrollable:可滚动的
tab的最大最小宽度
app:tabMaxWidth="0dp" :
app:tabMinWidth="0dp" :
tab的内边距
app:tabPaddingTop="0dp" :tab上内边距
app:tabPadding="0dp" :tab的内边距
tab的位置
app:tabGravity="center" :设置 fill 可以填充满item
自定义指示线
app:tabIndicator= : 注意!这里的指示线其实是android:state_selected="true"
的选中状态,所以如果单单写一个shape的xml文件设置是无法显示的,需要在写一个选中状态的xml。参考如下:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:bottom="8dp" android:left="8dp" android:right="8dp" android:top="8dp"> <!-- 设置边距 --> <shape> <!-- 设置圆角 --> <corners android:radius="5dp" /> <!-- 设置边框 --> <stroke android:width="1dp" android:color="@color/colorAccent" /> </shape> </item> </layer-list>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/indicator" android:state_selected="true" /> </selector>
改变字体大小与颜色
app:tabTextAppearance="@style/tab_layout_item_text" : 改变字体大小颜色等等,style参考如下:
<style name="tab_layout_item_text"> <item name="android:textSize">16sp</item> <item name="android:textColor">@color/color_18</item> </style>
TabLayout宽度填满
有时候你会发现TabLayout无法填满父类容器的宽度,在xml中添加下面三个属性,可以实现将宽度填充满
app:tabMaxWidth="0dp"
app:tabMode="fixed"
app:tabGravity="fill"
TabLayout与ViewPager配合使用
请注意,TabLayout与ViewPager配合使用是无法自定义标题Tab的View的。因为FragmentPagerAdapter会帮你实现标题Tab
代码
class HomeFragment : BaseFragment() {
private val mBinding by lazy { MainFragmentUsageBinding.inflate(layoutInflater) }
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return mBinding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initView()
}
private fun initView() {
val list = listOf<String>("主页","消息","设置")
val fragmentList = mutableListOf<Fragment>()
list.forEachIndexed { index, pair ->
fragmentList.add(Fragment.newInstance())
}
/**
* 如果你的布局是在fragment里,可以选择childFragmentManager或者activity的parentFragmentManager
* 如果你的布局在activity里,则选择supportFragmentManager
*/
val myAdapter = MyAdapter(parentFragmentManager, fragmentList, list)
mBinding.usageDayViewPager.adapter = myAdapter
//setupWithViewPager方法是关键,它负责组合ViewPager与TabLayout
mBinding.tabLayout.setupWithViewPager(mBinding.usageDayViewPager)
}
}
/**
* FragmentPagerAdapter需要使用它来创建适配器
*/
class MyAdapter(fm: FragmentManager, val list: List<Fragment>, val titleList: List<String>) : FragmentPagerAdapter(fm) {
override fun getCount() = list.size
override fun getItem(position: Int): Fragment {
return list[position]
}
/**
* 注意!TabLayout与ViewPager的组合会自己实现子Tab,所以子Tab的文字需要从这里提供
*/
override fun getPageTitle(position: Int): CharSequence? {
return titleList?.get(position)
}
}
其他API
以下是从View的源码里复制来的属性,以下属性仅做参考,有些并没有提供方法设置.比如tabTextSize 有归有,但是人家不提供方法设置..除非自己继承重写
int tabPaddingStart;
int tabPaddingTop;
int tabPaddingEnd;
int tabPaddingBottom;
int tabTextAppearance;
android.content.res.ColorStateList tabTextColors;
android.content.res.ColorStateList tabIconTint;
android.content.res.ColorStateList tabRippleColorStateList;
@androidx.annotation.Nullable
android.graphics.drawable.Drawable tabSelectedIndicator;
android.graphics.PorterDuff.Mode tabIconTintMode;
float tabTextSize;
float tabTextMultiLineSize;
final int tabBackgroundResId;
int tabMaxWidth;
private final int requestedTabMinWidth;
private final int requestedTabMaxWidth;
private final int scrollableTabMinWidth;
private int contentInsetStart;
int tabGravity;
int tabIndicatorAnimationDuration;
int tabIndicatorGravity;
int mode;
boolean inlineLabel;
boolean tabIndicatorFullWidth;
boolean unboundedRipple;
end
本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/11039643.html