Android自定义标题栏

今天写的是Android中常用的自定义标题栏,先看效果图:

效果图中所有的文字和图片都可以在你需要的时候设置进去,不需要的时候不让它显示出来,还可以设置标题栏的背景颜色,相信这样的自定义标题栏的适用性应该很广了,基本上都可以套用了,我写的注释很是详细,保证小白都可以看懂哦·······

下面开始我们的代码编辑工作吧。

1.写标题栏的布局文件mytitlebar.xml,代码如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:id="@+id/rl_root_layout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true">
    <TextView
        android:id="@+id/tv_back"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"/>
    <TextView
        android:id="@+id/tv_title_center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"/>
    <TextView
        android:id="@+id/tv_title_left"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_toLeftOf="@+id/tv_title_center"
        tools:ignore="RelativeOverlap"/>
    <TextView
        android:id="@+id/tv_title_right"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@+id/tv_title_center"/>
    <TextView
        android:id="@+id/tv_finish"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        tools:ignore="RelativeOverlap"/>
</RelativeLayout>

 

2.在res/values下创建attrs.xml资源文件,代码如下:

<resources>
    <declare-styleable name="MyTitleBar">
        <attr name="titlebar_backgroundColor" format="reference|color"/>


        <attr name="tv_back" format="reference|string"/>
        <attr name="tv_back_textColor" format="reference|color"/>
        <attr name="tv_back_textSize" format="dimension|reference"/>
        <attr name="iv_show_tv_back" format="boolean"/>


        <attr name="iv_back" format="reference"/>
        <attr name="tv_title_left" format="reference|string"/>
        <attr name="tv_title_left_textColor" format="reference|color"/>
        <attr name="tv_title_left_textSize" format="dimension|reference"/>


        <attr name="tv_title_center" format="reference|string"/>
        <attr name="tv_title_center_textColor" format="reference|color"/>
        <attr name="tv_title_center_textSize" format="dimension|reference"/>

        <attr name="tv_title_right" format="reference|string"/>
        <attr name="tv_title_right_textColor" format="reference|color"/>
        <attr name="tv_title_right_textSize" format="dimension|reference"/>

        <attr name="tv_finish" format="reference|string"/>
        <attr name="tv_finish_textColor" format="reference|color"/>
        <attr name="tv_finishtextSize" format="dimension|reference"/>
        <attr name="iv_show_tv_finish" format="boolean"/>
        <attr name="iv_finish" format="reference"/>

    </declare-styleable>
</resources>

 

3.在包下创建MyTitleBar.java文件,代码如下:

public class MyTitleBar extends RelativeLayout implements View.OnClickListener {
    private TitlebarOnClickListener mTitlebarOnClickListener;//监听自定义标题栏的对外接口
    private RelativeLayout mRlRootLayout;//标题栏的根布局
    private int titlebar_background;//标题栏的背景颜色

    private TextView mTvBack;//标题栏最左侧的文本控件
    private String tvBackText;//标题栏最左侧的文本内容
    private int tvBackTextColor;//标题栏最左侧的文本字体颜色
    private int tvBackTextSize;//标题栏最左侧的文本字体大小
    private int ivBackId;//标题栏最左侧的图片资源
    private boolean ivShowTvBack;//是否显示标题栏最左侧的文本图片

    private TextView mTvFinish;//标题栏最右侧的文本控件
    private String tvFinishText;//标题栏最右侧的文本内容
    private int tvFinishTextColor;//标题栏最右侧的文本字体颜色
    private int tvFinishTextSize;//标题栏最右侧的文本字体大小
    private int ivFinishId;//标题栏最右侧的图片资源
    private boolean ivShowTvFinish;//是否显示标题栏最右侧的文本图片

    private TextView mTvTitleLeft;//标题栏中间的左标题的文本控件
    private String tvTitleLeftText;//标题栏中间的左标题的文本内容
    private int tvTitleLeftTextColor;//标题栏中间的左标题的文本字体颜色
    private int tvTitleLeftTextSize;//标题栏中间的左标题的文本字体大小

    private TextView mTvTitleCenter;//标题栏中间的中间标题的文本控件
    private String tvTitleCenterText;//标题栏中间的中间标题的文本内容
    private int tvTitleCenterTextColor;//标题栏中间的中间标题的文本字体颜色
    private int tvTitleCenterTextSize;//标题栏中间的中间标题的文本字体大小

    private TextView mTvTitleRight;//标题栏中间的右标题的文本控件
    private String tvTitleRightText;//标题栏中间的右标题的文本内容
    private int tvTitleRightTextColor;//标题栏中间的右标题的文本字体颜色
    private int tvTitleRightTextSize;//标题栏中间的右标题的文本字体大小

    public MyTitleBar(Context context) {
        super(context, null);
    }

    public MyTitleBar(Context context, AttributeSet attrs) {
        super(context, attrs);

        initViews(context);//初始化控件
        initAttrs(context, attrs);//初始化属性
        setAttrs();//设置属性
    }

    /**
     * 初始化控件
     */
    private void initViews(Context context) {
        View.inflate(context, R.layout.mytitlebar, this);//加载布局文件
        mRlRootLayout = (RelativeLayout) findViewById(R.id.rl_root_layout);
        mTvBack = (TextView) findViewById(R.id.tv_back);
        mTvTitleLeft = (TextView) findViewById(R.id.tv_title_left);
        mTvTitleCenter = (TextView) findViewById(R.id.tv_title_center);
        mTvTitleRight = (TextView) findViewById(R.id.tv_title_right);
        mTvFinish = (TextView) findViewById(R.id.tv_finish);
    }

    /**
     * 初始化属性
     */
    private void initAttrs(Context context, AttributeSet attrs) {
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MyTitleBar);//获取属性
        titlebar_background = typedArray.getColor(R.styleable.MyTitleBar_titlebar_backgroundColor, 0);

        tvBackText = typedArray.getString(R.styleable.MyTitleBar_tv_back);
        tvBackTextColor = typedArray.getColor(R.styleable.MyTitleBar_tv_back_textColor, 0);
        tvBackTextSize = typedArray.getDimensionPixelSize(R.styleable.MyTitleBar_tv_back_textSize, sp2px(context, 10));
        ivShowTvBack = typedArray.getBoolean(R.styleable.MyTitleBar_iv_show_tv_back, false);
        ivBackId = typedArray.getResourceId(R.styleable.MyTitleBar_iv_back, 0);

        tvFinishText = typedArray.getString(R.styleable.MyTitleBar_tv_finish);
        tvFinishTextColor = typedArray.getColor(R.styleable.MyTitleBar_tv_finish_textColor, 0);
        tvFinishTextSize = typedArray.getDimensionPixelSize(R.styleable.MyTitleBar_tv_finishtextSize, sp2px(context, 10));
        ivShowTvFinish = typedArray.getBoolean(R.styleable.MyTitleBar_iv_show_tv_finish, false);
        ivFinishId = typedArray.getResourceId(R.styleable.MyTitleBar_iv_finish, 0);

        tvTitleLeftText = typedArray.getString(R.styleable.MyTitleBar_tv_title_left);
        tvTitleLeftTextColor = typedArray.getColor(R.styleable.MyTitleBar_tv_title_left_textColor, 0);
        tvTitleLeftTextSize = typedArray.getDimensionPixelSize(R.styleable.MyTitleBar_tv_title_left_textSize, sp2px(context, 10));

        tvTitleCenterText = typedArray.getString(R.styleable.MyTitleBar_tv_title_center);
        tvTitleCenterTextColor = typedArray.getColor(R.styleable.MyTitleBar_tv_title_center_textColor, 0);
        tvTitleCenterTextSize = typedArray.getDimensionPixelSize(R.styleable.MyTitleBar_tv_title_center_textSize, sp2px(context, 10));

        tvTitleRightText = typedArray.getString(R.styleable.MyTitleBar_tv_title_right);
        tvTitleRightTextColor = typedArray.getColor(R.styleable.MyTitleBar_tv_title_right_textColor, 0);
        tvTitleRightTextSize = typedArray.getDimensionPixelSize(R.styleable.MyTitleBar_tv_title_right_textSize, sp2px(context, 10));

        typedArray.recycle();
    }

    /**
     * 设置属性
     */
    private void setAttrs() {
        setTitlebarBackgroundColor(titlebar_background);//设置标题栏根布局的颜色,默认白色

        setTvBackText(tvBackText);//设置标题栏最左侧的文本内容
        setTvBackTextColor(tvBackTextColor);//设置标题栏最左侧的文本字体颜色
        setTvBackTextSize(tvBackTextSize);//设置标题栏最左侧的文本字体大小
        setIvShowTvBack(ivShowTvBack);//设置标题栏最左侧的文本图片

        setTvFinishText(tvFinishText);//设置标题栏最右侧的文本内容
        setTvFinishTextColor(tvFinishTextColor);//设置标题栏最右侧的文本字体颜色
        setTvFinishTextSize(tvFinishTextSize);//设置标题栏最右侧的文本字体大小
        setIvShowTvFinish(ivShowTvFinish);//设置标题栏最右侧的文本图片

        setTvTitleLeftText(tvTitleLeftText);//设置标题栏中间的左标题的文本内容
        setTvTitleLeftTextColor(tvTitleLeftTextColor);//设置标题栏中间的左标题的文本字体颜色
        setTvTitleLeftTextSize(tvTitleLeftTextSize);//设置标题栏中间的左标题的文本字体大小

        setTvTitleCenterText(tvTitleCenterText);//设置标题栏中间的中间标题的文本内容
        setTvTitleCenterTextColor(tvTitleCenterTextColor);//设置标题栏中间的中间标题的文本字体颜色
        setTvTitleCenterTextSize(tvTitleCenterTextSize);//设置标题栏中间的中间标题的文本字体大小

        setTvTitleRightText(tvTitleRightText);//设置标题栏中间的右标题的文本内容
        setTvTitleRightTextColor(tvTitleRightTextColor);//设置标题栏中间的右标题的文本字体颜色
        setTvTitleRightTextSize(tvTitleRightTextSize);//设置标题栏中间的右标题的文本字体大小
    }

    public static int sp2px(Context context, float spValue) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, spValue, context.getResources().getDisplayMetrics());
    }

    /**
     * 外部调用时需要用到的接口
     */
    public interface TitlebarOnClickListener {
        void titlebarOnClickListener(View view);
    }

    /**
     * 外部调用时通过此方法为标题栏的各控件设置监听
     *
     * @param listener 监听器
     */
    public void setOnClickListener(TitlebarOnClickListener listener) {
        mTvBack.setOnClickListener(this);
        mTvFinish.setOnClickListener(this);
        mTvTitleLeft.setOnClickListener(this);
        mTvTitleCenter.setOnClickListener(this);
        mTvTitleRight.setOnClickListener(this);


        mTitlebarOnClickListener = listener;
    }

    @Override
    public void onClick(View view) {
        mTitlebarOnClickListener.titlebarOnClickListener(view);
    }

    /**
     * 设置标题栏根布局的颜色,默认白色
     *
     * @param titlebar_background 背景色,默认白色
     */
    private void setTitlebarBackgroundColor(int titlebar_background) {
        if (titlebar_background == 0) {
            mRlRootLayout.setBackgroundColor(Color.WHITE);//默认白色
        } else {
            mRlRootLayout.setBackgroundColor(titlebar_background);
        }
    }

    /**
     * 设置标题栏最左侧的文本内容
     *
     * @param tvBackText 文本内容
     */
    private void setTvBackText(String tvBackText) {
        mTvBack.setText(tvBackText);
    }

    /**
     * 设置标题栏最左侧的文本字体颜色
     *
     * @param tvBackTextColor 字体颜色,默认黑色
     */
    private void setTvBackTextColor(int tvBackTextColor) {
        if (tvBackTextColor == 0) {
            mTvBack.setTextColor(Color.BLACK);//默认黑色
        } else {
            mTvBack.setTextColor(tvBackTextColor);
        }
    }

    /**
     * 设置标题栏最左侧的文本字体大小
     *
     * @param tvBackTextSize 字体大小
     */
    private void setTvBackTextSize(int tvBackTextSize) {
        mTvBack.setTextSize(tvBackTextSize);
    }

    /**
     * 设置标题栏最左侧的文本图片
     *
     * @param ivShowTvBack 是否显示,默认不显示
     */
    private void setIvShowTvBack(boolean ivShowTvBack) {
        if (ivShowTvBack && ivBackId != 0) {
            Drawable drawable = ContextCompat.getDrawable(getContext(), ivBackId);
            drawable.setBounds(0, 0, 40, 40);//这一步必须要做,否则不会显示
            mTvBack.setCompoundDrawables(drawable, null, null, null);
        }
    }

    /**
     * 设置标题栏最右侧的文本内容
     *
     * @param tvFinishText 文本内容
     */
    private void setTvFinishText(String tvFinishText) {
        mTvFinish.setText(tvFinishText);
    }

    /**
     * 设置标题栏最右侧的文本字体颜色
     *
     * @param tvFinishTextColor 字体颜色,默认黑色
     */
    private void setTvFinishTextColor(int tvFinishTextColor) {
        if (tvFinishTextColor == 0) {
            mTvFinish.setTextColor(Color.BLACK);//默认黑色
        } else {
            mTvFinish.setTextColor(tvFinishTextColor);
        }
    }

    /**
     * 设置标题栏最右侧的文本字体大小
     *
     * @param tvFinishTextSize 字体大小
     */
    private void setTvFinishTextSize(int tvFinishTextSize) {
        mTvFinish.setTextSize(tvFinishTextSize);
    }

    /**
     * 设置标题栏最右侧的文本图片
     *
     * @param ivShowTvFinish 是否显示,默认不显示
     */
    private void setIvShowTvFinish(boolean ivShowTvFinish) {
        if (ivShowTvFinish && ivFinishId != 0) {
            Drawable drawable = ContextCompat.getDrawable(getContext(), ivFinishId);
            drawable.setBounds(0, 0, 40, 40);//这一步必须要做,否则不会显示
            mTvFinish.setCompoundDrawables(null, null, drawable, null);
        }
    }

    /**
     * 设置标题栏中间的左标题的文本内容
     *
     * @param tvTitleLeftText 文本内容
     */
    private void setTvTitleLeftText(String tvTitleLeftText) {
        mTvTitleLeft.setText(tvTitleLeftText);
    }

    /**
     * 设置标题栏中间的左标题的文本字体颜色
     *
     * @param tvTitleLeftTextColor 字体颜色,默认黑色
     */
    private void setTvTitleLeftTextColor(int tvTitleLeftTextColor) {
        if (tvTitleLeftTextColor == 0) {
            mTvTitleLeft.setTextColor(Color.BLACK);//默认黑色
        } else {
            mTvTitleLeft.setTextColor(tvTitleLeftTextColor);
        }
    }

    /**
     * 设置标题栏中间的左标题的文本字体大小
     *
     * @param tvTitleLeftTextSize 字体大小
     */
    private void setTvTitleLeftTextSize(int tvTitleLeftTextSize) {
        mTvTitleLeft.setTextSize(tvTitleLeftTextSize);
    }

    /**
     * 设置标题栏中间的中间标题的文本内容
     *
     * @param tvTitleCenterText 文本内容
     */
    private void setTvTitleCenterText(String tvTitleCenterText) {
        mTvTitleCenter.setText(tvTitleCenterText);
    }

    /**
     * 设置标题栏中间的中间标题的文本字体颜色
     *
     * @param tvTitleCenterTextColor 字体颜色,默认黑色
     */
    private void setTvTitleCenterTextColor(int tvTitleCenterTextColor) {
        if (tvTitleCenterTextColor == 0) {
            mTvTitleCenter.setTextColor(Color.BLACK);//默认黑色
        } else {
            mTvTitleCenter.setTextColor(tvTitleCenterTextColor);
        }
    }

    /**
     * 设置标题栏中间的中间标题的文本字体大小
     *
     * @param tvTitleCenterTextSize 字体大小
     */
    private void setTvTitleCenterTextSize(int tvTitleCenterTextSize) {
        mTvTitleCenter.setTextSize(tvTitleCenterTextSize);
    }

    /**
     * 设置标题栏中间的右标题的文本内容
     *
     * @param tvTitleRightText 文本内容
     */
    private void setTvTitleRightText(String tvTitleRightText) {
        mTvTitleRight.setText(tvTitleRightText);
    }

    /**
     * 设置标题栏中间的右标题的文本字体颜色
     *
     * @param tvTitleRightTextColor 字体颜色,默认黑色
     */
    private void setTvTitleRightTextColor(int tvTitleRightTextColor) {
        if (tvTitleRightTextColor == 0) {
            mTvTitleRight.setTextColor(Color.BLACK);//默认黑色
        } else {
            mTvTitleRight.setTextColor(tvTitleRightTextColor);
        }
    }

    /**
     * 设置标题栏中间的右标题的文本字体大小
     *
     * @param tvTitleRightTextSize 字体大小
     */
    private void setTvTitleRightTextSize(int tvTitleRightTextSize) {
        mTvTitleRight.setTextSize(tvTitleRightTextSize);
    }

 

自定义标题栏到此就基本吹响结束的口号了,现在标题栏定义好了,那么该如何使用呢?

1.在你想要使用自定义标题栏的布局文件上引用即可,我这里就直接在activity_main.xml中使用了,代码如下:

<com.example.mytitlebar.MyTitleBar
        android:id="@+id/mytitlebar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:iv_back="@drawable/icon_back"
        app:iv_finish="@drawable/icon_finish"
        app:iv_show_tv_back="true"
        app:iv_show_tv_finish="true"
        app:titlebar_backgroundColor="@color/colorAccent"
        app:tv_back="返回"
        app:tv_back_textColor="#005620"
        app:tv_back_textSize="4sp"
        app:tv_finish="完成"
        app:tv_finish_textColor="#951201"
        app:tv_finishtextSize="4sp"
        app:tv_title_center="中间标题"
        app:tv_title_center_textColor="#995120"
        app:tv_title_center_textSize="8sp"
        app:tv_title_left="左标题"
        app:tv_title_left_textColor="#169900"
        app:tv_title_left_textSize="6sp"
        app:tv_title_right="右标题"
        app:tv_title_right_textColor="#265891"
        app:tv_title_right_textSize="6sp">
    </com.example.mytitlebar.MyTitleBar>

运行这个项目之后,你就能在界面上看到刚才的效果图了····

别着急,还没完呢,标题栏没有点击事件怎么行,留意的人已经看到刚才我在MyTitleBar.java文件中定义了一个借口,这就是为了给外部调用的啦,如果调用,请看代码:

myTitleBar.setOnClickListener(new MyTitleBar.TitlebarOnClickListener() {
            @Override
            public void titlebarOnClickListener(View view) {
                switch (view.getId()) {
                    case R.id.tv_back:
                        Log.d("MainActivity", "你点击了返回按钮");
                        break;
                    case R.id.tv_finish:
                        Log.d("MainActivity", "你点击了完成按钮");
                        break;
                    case R.id.tv_title_left:
                        Log.d("MainActivity", "你点击了左标题");
                        break;
                    case R.id.tv_title_center:
                        Log.d("MainActivity", "你点击了中间标题");
                        break;
                    case R.id.tv_title_right:
                        Log.d("MainActivity", "你点击了右标题");
                        break;
                }
            }
        });

至此,就真的结束了,是不是可以很好的掌握了呢?

有需要下载的看官,请点击如下下载链接(支持共享精神,免积分下载哦):

http://download.csdn.net/detail/yan_yu_lin/9823235

有任何问题欢迎留言讨论,一起学习,一起进步,口号喊起来····“为实现伟大复兴的中国梦而努力奋斗吧,骚年”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值