一手遮天 Android - view(导航类): TabBar 自己实现

一手遮天 Android - view(导航类): TabBar 自己实现,第1张

概述项目地址https://github.com/webabcd/AndroidDemo作者webabcd一手遮天Android-view(导航类):TabBar自己实现示例如下:/viewavigation/TabBarDemo1.java/***虽然没有官方的TabBar控件,但是可以自己实现一个,参见viewavigation/TabBarDemo1_MyTabBar.java*/

项目地址 https://github.com/webabcd/AndroidDemo
作者 webabcd

一手遮天 AndroID - vIEw(导航类): Tabbar 自己实现示例如下:

/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 自己实现所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/999506.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存