Android自定义TitleBar

开发过程中会遇见很多app顶部的控制栏,封装一个通用TitleBar

这里写图片描述

attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="TitleBar">
        <!--标题-->
        <attr name="title" format="string" />
        <!--右边文字-->
        <attr name="rightText" format="string" />
        <!--右边图片-->
        <attr name="rightIcon" format="reference" />
        <!--右边文字是否可见-->
        <attr name="rightTextVisible" format="boolean" />
        <!--右边图片是否可见-->
        <attr name="rightIconVisible" format="boolean" />
        <!--是否隐藏返回键-->
        <attr name="backVisible" format="boolean" />
    </declare-styleable>
</resources>

自定义View

package com.sample.titlebar.widget;

import android.app.Activity;
import android.content.Context;
import android.content.res.TypedArray;
import android.support.annotation.AttrRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.sample.titlebar.R;


public class TitleBar extends FrameLayout {

    private RelativeLayout mRootLayout;
    private TextView mTvTitle;
    private ImageView mIvBack;
    private TextView mTvRightText;
    private ImageView mIvRightIcon;

    public TitleBar(@NonNull Context context) {
        this(context, null);
    }

    public TitleBar(@NonNull Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public TitleBar(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }

    private void init(Context context, AttributeSet attrs) {
        LayoutInflater.from(context).inflate(R.layout.widget_title_bar, this);
        mRootLayout = (RelativeLayout) findViewById(R.id.root_layout);
        mTvTitle = (TextView) mRootLayout.findViewById(R.id.title_text);
        mIvBack = (ImageView) mRootLayout.findViewById(R.id.title_back);
        mTvRightText = (TextView) mRootLayout.findViewById(R.id.right_text);
        mIvRightIcon = (ImageView) mRootLayout.findViewById(R.id.right_icon);

        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.TitleBar);
        String title = array.getString(R.styleable.TitleBar_title);
        String rightText = array.getString(R.styleable.TitleBar_rightText);
        int rightIcon = array.getResourceId(R.styleable.TitleBar_rightIcon, 0);
        boolean backVisible = array.getBoolean(R.styleable.TitleBar_backVisible, true);
        boolean rightTextVisible = array.getBoolean(R.styleable.TitleBar_rightTextVisible, false);
        boolean rightIconVisible = array.getBoolean(R.styleable.TitleBar_rightIconVisible, false);
        array.recycle();

        setTitle(title);
        setRightText(rightText);
        setRightIcon(rightIcon);
        setBackVisible(backVisible);
        setRightTextVisible(rightTextVisible);
        setRightIconVisible(rightIconVisible);
    }

    /**
     * 设置标题
     *
     * @param title
     * @return
     */
    public TitleBar setTitle(String title) {
        if (!TextUtils.isEmpty(title)) {
            mTvTitle.setText(title);
        }
        return this;
    }

    /**
     * 设置右边文字
     *
     * @param rightText
     */
    private void setRightText(String rightText) {
        if (!TextUtils.isEmpty(rightText)) {
            mTvRightText.setText(rightText);
        }
    }

    /**
     * 设置右边图片
     *
     * @param rightIcon
     */
    private void setRightIcon(int rightIcon) {
        if (rightIcon != 0) {
            mIvRightIcon.setImageResource(rightIcon);
        }
    }

    /**
     * 关闭Activity
     *
     * @param activity
     * @return
     */
    public TitleBar setBackFinish(final Activity activity) {
        if (activity != null)
            mIvBack.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    activity.finish();
                }
            });
        return this;
    }

    /**
     * 右边文字监听
     *
     * @param onClickListener
     * @return
     */
    public TitleBar setRightTextClickListener(OnClickListener onClickListener) {
        mTvRightText.setOnClickListener(onClickListener);
        return this;
    }

    /**
     * 右边图片监听
     *
     * @param onClickListener
     * @return
     */
    public TitleBar setRightIconClickListener(OnClickListener onClickListener) {
        mIvRightIcon.setOnClickListener(onClickListener);
        return this;
    }

    /**
     * 返回键是否显示
     *
     * @param backVisible
     */
    private void setBackVisible(boolean backVisible) {
        if (backVisible) {
            if (mIvBack.getVisibility() != VISIBLE) {
                mIvBack.setVisibility(VISIBLE);
            }
        } else {
            if (mIvBack.getVisibility() != GONE) {
                mIvBack.setVisibility(GONE);
            }
        }
    }

    /**
     * 右边文字是否显示
     *
     * @param rightTextVisible
     */
    public void setRightTextVisible(boolean rightTextVisible) {
        if (rightTextVisible) {
            if (mTvRightText.getVisibility() != VISIBLE) {
                mTvRightText.setVisibility(VISIBLE);
            }
        } else {
            if (mTvRightText.getVisibility() != GONE) {
                mTvRightText.setVisibility(GONE);
            }
        }
    }

    /**
     * 右边图片是否显示
     *
     * @param rightIconVisible
     */
    public void setRightIconVisible(boolean rightIconVisible) {
        if (rightIconVisible) {
            if (mIvRightIcon.getVisibility() != VISIBLE) {
                mIvRightIcon.setVisibility(VISIBLE);
            }
        } else {
            if (mIvRightIcon.getVisibility() != GONE) {
                mIvRightIcon.setVisibility(GONE);
            }
        }
    }

    /**
     * 设置背景颜色
     *
     * @param color
     */
    public void setBackgroundColor(int color) {
        mRootLayout.setBackgroundColor(color);
    }
}

widget_title_bar.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/root_layout"
    android:layout_width="match_parent"
    android:layout_height="48dp"
    android:background="#3bd6cd">

    <TextView
        android:id="@+id/title_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text=""
        android:textColor="#ffffff"
        android:textSize="20sp" />

    <ImageView
        android:id="@+id/title_back"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_centerVertical="true"
        android:paddingLeft="23dp"
        android:paddingRight="23dp"
        android:src="@drawable/title_back" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/right_text"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center_vertical"
            android:paddingRight="23dp"
            android:text="right"
            android:textColor="#ffffff"
            android:textSize="16sp"
            android:visibility="gone" />

        <ImageView
            android:id="@id/right_icon"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:paddingLeft="23dp"
            android:paddingRight="23dp"
            android:visibility="gone" />
    </LinearLayout>
</RelativeLayout>

Activity

package com.sample.titlebar;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;

import com.sample.titlebar.widget.TitleBar;

public class MainActivity extends AppCompatActivity {

    private TitleBar titlebar01;
    private TitleBar titlebar02;
    private TitleBar titlebar03;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("TitelBar");

        titlebar01 = (TitleBar) findViewById(R.id.titlebar01);
        titlebar02 = (TitleBar) findViewById(R.id.titlebar02);
        titlebar03 = (TitleBar) findViewById(R.id.titlebar03);

        titlebar01.setBackFinish(this);

        titlebar02.setBackFinish(this)
                .setRightTextClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(MainActivity.this, "描述", Toast.LENGTH_SHORT).show();
                    }
                });

        titlebar03.setRightIconClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "设置", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context="com.sample.titlebar.MainActivity">

    <com.sample.titlebar.widget.TitleBar
        android:id="@+id/titlebar01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:title="标题一" />

    <com.sample.titlebar.widget.TitleBar
        android:id="@+id/titlebar02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        app:rightText="描述"
        app:rightTextVisible="true"
        app:title="标题二" />

    <com.sample.titlebar.widget.TitleBar
        android:id="@+id/titlebar03"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        app:rightIcon="@drawable/setting"
        app:rightIconVisible="true"
        app:title="标题三" />
</LinearLayout>

代码下载

猜你喜欢

转载自blog.csdn.net/qq_14876133/article/details/80915194