一手遮天 AndroID - vIEw(导航类): Tabbar 自己实现示例如下:项目地址 https://github.com/webabcd/AndroidDemo
作者 webabcd
/vIEw/navigation/TabbarDemo1.java
/** * 虽然没有官方的 Tabbar 控件,但是可以自己实现一个,参见 vIEw/navigation/TabbarDemo1_MyTabbar.java */package com.webabcd.androIDdemo.vIEw.navigation;import androIDx.appcompat.app.AppCompatActivity;import androID.os.Bundle;import androID.Widget.Toast;import com.webabcd.androIDdemo.R;public class TabbarDemo1 extends AppCompatActivity { private TabbarDemo1_MyTabbar mTabbar1; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_vIEw_navigation_tabbardemo1); mTabbar1 = findVIEwByID(R.ID.tabbar1); // 选中的 tab 项发生变化时的回调 mTabbar1.setonItemChangedListener(new TabbarDemo1_MyTabbar.OnItemChangedListener() { @OverrIDe public voID onItemChanged(int itemIndex) { Toast.makeText(TabbarDemo1.this, "selected tab: " + itemIndex, Toast.LENGTH_SHORT).show(); } }); }}
\vIEw\navigation\TabbarDemo1_MyTabbar.java
/** * 自定义 Tabbar 控件,继承自 linearLayout * * 本身 linearLayout 用于水平排列每个 tab 项 * 每个 tab 项是一个 linearLayout,用于垂直排列此 tab 项的图标和文本 */package com.webabcd.androIDdemo.vIEw.navigation;import androID.content.Context;import androID.util.AttributeSet;import androID.vIEw.Gravity;import androID.vIEw.VIEw;import androID.vIEw.VIEwGroup;import androID.Widget.ImageVIEw;import androID.Widget.linearLayout;import androID.Widget.TextVIEw;import com.webabcd.androIDdemo.R;import com.webabcd.androIDdemo.utils.Helper;public class TabbarDemo1_MyTabbar extends linearLayout { // Tabbar 的文字 private String[] mTextList = {"tab1", "tab2", "tab3"}; // Tabbar 的图标(非选中状态) private int[] mIconDefaultList = {R.drawable.ic_expand_less, R.drawable.ic_expand_less, R.drawable.ic_expand_less}; // Tabbar 的图标(选中状态) private int[] mIconSelectedList = {R.drawable.ic_expand_more, R.drawable.ic_expand_more, R.drawable.ic_expand_more}; // Tabbar 的文字颜色(非选中状态) private int mcolorDefault = getResources().getcolor(R.color.red); // Tabbar 的文字颜色(选中状态) private int mcolorSelected = getResources().getcolor(R.color.green); // Tabbar 的背景颜色 private int mcolorBackground = getResources().getcolor(R.color.white); // 当前选中的 tab 项的索引位置 private int mSelectedindex = 0; public TabbarDemo1_MyTabbar(Context context, AttributeSet attributeSet) { super(context, attributeSet); // 本身 linearLayout 用于水平排列每个 tab 项 setLayoutParams(new VIEwGroup.LayoutParams(VIEwGroup.LayoutParams.MATCH_PARENT, Helper.dp2px(context, 60))); setBackgroundcolor(mcolorBackground); // 构造每个 tab 项 for (int i = 0; i < mTextList.length; i++) { // 每个 tab 项是一个 linearLayout(用于垂直排列此 tab 项的图标和文本) final linearLayout linearLayoutChild = new linearLayout(context); linearLayoutChild.setLayoutParams(new linearLayout.LayoutParams(VIEwGroup.LayoutParams.WRAP_CONTENT, VIEwGroup.LayoutParams.MATCH_PARENT, 1)); linearLayoutChild.setGravity(Gravity.CENTER); linearLayoutChild.setorIEntation(linearLayout.VERTICAL); linearLayoutChild.setWeightSum(1); linearLayoutChild.setTag(i); // tag 值与当前 tab 的索引位置关联 addVIEw(linearLayoutChild); // 某个 tab 项的图标 linearLayout.LayoutParams lp = new linearLayout.LayoutParams(Helper.dp2px(context, 26), Helper.dp2px(context, 26)); lp.setmargins(0, 5, 0, 0); ImageVIEw imageVIEw = new ImageVIEw(context); imageVIEw.setLayoutParams(lp); imageVIEw.setimageResource(mIconDefaultList[i]); imageVIEw.setTag("image_" + i); // tag 值与当前 tab 的索引位置关联 linearLayoutChild.addVIEw(imageVIEw); // 某个 tab 项的文字 lp = new linearLayout.LayoutParams(linearLayout.LayoutParams.WRAP_CONTENT, linearLayout.LayoutParams.WRAP_CONTENT); lp.setmargins(0, 10, 0, 0); TextVIEw textVIEw = new TextVIEw(context); textVIEw.setText(mTextList[i]); textVIEw.setTextSize(14); textVIEw.setTextcolor(mcolorDefault); textVIEw.setGravity(Gravity.CENTER); textVIEw.setLayoutParams(lp); textVIEw.setTag("text_" + i); // tag 值与当前 tab 的索引位置关联 linearLayoutChild.addVIEw(textVIEw); // 某个 tab 项的点击事件 linearLayoutChild.setonClickListener(new OnClickListener() { @OverrIDe public voID onClick(VIEw v) { // 指定当前选中的 tab 项 setSelectedTab(v); } }); } // 初始化选中的 tab 项的图片 ImageVIEw imageVIEw = findVIEwWithTag("image_" + mSelectedindex); imageVIEw.setimageResource(mIconSelectedList[mSelectedindex]); // 初始化选中的 tab 项的文本颜色 TextVIEw textVIEw = findVIEwWithTag("text_" + mSelectedindex); textVIEw.setTextcolor(mcolorSelected); } // 指定当前选中的 tab 项 private voID setSelectedTab(VIEw vIEw) { if (mSelectedindex != (int) vIEw.getTag()) { // 设置上一次被选中的 tab 项的图片(现在变为未选中) ImageVIEw imageVIEw1 = findVIEwWithTag("image_" + mSelectedindex); imageVIEw1.setimageResource(mIconDefaultList[mSelectedindex]); // 设置上一次被选中的 tab 项的文本颜色(现在变为未选中) TextVIEw textVIEw1 = findVIEwWithTag("text_" + mSelectedindex); textVIEw1.setTextcolor(mcolorDefault); // 设置当前选中的 tab 项的索引位置 mSelectedindex = (int) vIEw.getTag(); // 设置当前选中的 tab 项的图片 ImageVIEw imageVIEw = vIEw.findVIEwWithTag("image_" + mSelectedindex); imageVIEw.setimageResource(mIconSelectedList[mSelectedindex]); // 设置当前选中的 tab 项的文本颜色 TextVIEw textVIEw = vIEw.findVIEwWithTag("text_" + mSelectedindex); textVIEw.setTextcolor(mcolorSelected); // 触发选中的 tab 项发生变化时的事件 performItemChanged(mSelectedindex); } } // 选中的 tab 项发生变化时的回调 private OnItemChangedListener mOnItemChangedListener; public interface OnItemChangedListener { voID onItemChanged(int itemIndex); } public voID setonItemChangedListener(OnItemChangedListener Listener) { mOnItemChangedListener = Listener; } protected voID performItemChanged(int itemIndex) { if (mOnItemChangedListener != null) { mOnItemChangedListener.onItemChanged(itemIndex); } }}
/layout/activity_vIEw_navigation_tabbardemo1.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:layout_wIDth="match_parent" androID:layout_height="match_parent"> <!-- 自定义 Tabbar 控件(参见 vIEw/navigation/TabbarDemo1_MyTabbar.java) --> <com.webabcd.androIDdemo.vIEw.navigation.TabbarDemo1_MyTabbar androID:ID="@+ID/tabbar1" androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" /></androIDx.constraintlayout.Widget.ConstraintLayout>
总结项目地址 https://github.com/webabcd/AndroidDemo
作者 webabcd
以上是内存溢出为你收集整理的一手遮天 Android - view(导航类): TabBar 自己实现全部内容,希望文章能够帮你解决一手遮天 Android - view(导航类): TabBar 自己实现所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)