赞
踩
1.)先定义一个布局文件
- <merge xmlns:android="http://schemas.android.com/apk/res/android">
-
- <Button
- android:id="@+id/title_bar_left"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_centerVertical="true"
- android:layout_marginLeft="5dp"
- android:background="@null"
- android:minHeight="45dp"
- android:minWidth="45dp"
- android:textSize="14sp" />
-
- <TextView
- android:id="@+id/title_bar_title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerInParent="true"
- android:singleLine="true"
- android:textSize="17sp" />
-
- <Button
- android:id="@+id/title_bar_right"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_centerVertical="true"
- android:layout_marginRight="7dp"
- android:background="@null"
- android:minHeight="45dp"
- android:minWidth="45dp"
- android:textSize="14sp" />
-
- </merge>

注意:这里为何要使用merge标签,自定义组合控件时会继承RelativeLayout、LinearLayout等控件,这样导致布局的层级无形中增加了一层,如下是对比:
未使用merge标签
使用merge标签
2.)定义自定义属性
比如标题文字、标题栏左边按钮图标等。
- <declare-styleable name="CustomTitleBar">
- <attr name="title_background_color" format="reference|integer" />
- <attr name="left_button_visible" format="boolean" />
- <attr name="right_button_visible" format="boolean" />
- <attr name="title_text" format="string" />
- <attr name="title_text_color" format="color" />
- <attr name="title_text_drawable" format="reference|integer" />
- <attr name="right_button_text" format="string" />
- <attr name="right_button_text_color" format="color" />
- <attr name="right_button_drawable" format="reference|integer" />
- <attr name="left_button_text" format="string" />
- <attr name="left_button_text_color" format="color" />
- <attr name="left_button_drawable" format="reference|integer" />
- </declare-styleable
3.)自定义一个View根据需求继承不同的ViewGroup子类,比如:RelativeLayout、LinearLayout等,我们这里继承RelativeLayout。
- public class CustomTitleBar extends RelativeLayout {
- private Button titleBarLeftBtn;
- private Button titleBarRightBtn;
- private TextView titleBarTitle;
-
- public CustomTitleBar(Context context, AttributeSet attrs) {
- super(context, attrs);
- LayoutInflater.from(context).inflate(R.layout.custom_title_bar, this, true);
- titleBarLeftBtn = (Button) findViewById(R.id.title_bar_left);
- titleBarRightBtn = (Button) findViewById(R.id.title_bar_right);
- titleBarTitle = (TextView) findViewById(R.id.title_bar_title);
-
- TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.CustomTitleBar);
- if (attributes != null) {
- //处理titleBar背景色
- int titleBarBackGround = attributes.getResourceId(R.styleable.CustomTitleBar_tlb_title_background_color, Color.GREEN);
- setBackgroundResource(titleBarBackGround);
- //先处理左边按钮
- //获取是否要显示左边按钮
- boolean leftButtonVisible = attributes.getBoolean(R.styleable.CustomTitleBar_tlb_left_button_visible, true);
- if (leftButtonVisible) {
- titleBarLeftBtn.setVisibility(View.VISIBLE);
- } else {
- titleBarLeftBtn.setVisibility(View.INVISIBLE);
- }
- //设置左边按钮的文字
- String leftButtonText = attributes.getString(R.styleable.CustomTitleBar_tlb_left_button_text);
- if (!TextUtils.isEmpty(leftButtonText)) {
- titleBarLeftBtn.setText(leftButtonText);
- //设置左边按钮文字颜色
- int leftButtonTextColor = attributes.getColor(R.styleable.CustomTitleBar_tlb_left_button_text_color, Color.WHITE);
- titleBarLeftBtn.setTextColor(leftButtonTextColor);
- }
- //设置左边图片icon 这里是二选一 要么只能是文字 要么只能是图片
- int leftButtonDrawable = attributes.getResourceId(R.styleable.CustomTitleBar_tlb_left_button_drawable, R.mipmap.titlebar_back_icon);
- if (leftButtonDrawable != -1) {
- titleBarLeftBtn.setCompoundDrawablesWithIntrinsicBounds(leftButtonDrawable, 0, 0, 0); //设置到哪个控件的位置()
- }
-
-
- //处理标题
- //先获取标题是否要显示图片icon
- int titleTextDrawable = attributes.getResourceId(R.styleable.CustomTitleBar_tlb_title_text_drawable, -1);
- if (titleTextDrawable != -1) {
- titleBarTitle.setBackgroundResource(titleTextDrawable);
- } else {
- //如果不是图片标题 则获取文字标题
- String titleText = attributes.getString(R.styleable.CustomTitleBar_tlb_title_text);
- if (!TextUtils.isEmpty(titleText)) {
- titleBarTitle.setText(titleText);
- }
- //获取标题显示颜色
- int titleTextColor = attributes.getColor(R.styleable.CustomTitleBar_tlb_title_text_color, Color.WHITE);
- titleBarTitle.setTextColor(titleTextColor);
- }
-
- //先处理右边按钮
- //获取是否要显示右边按钮
- boolean rightButtonVisible = attributes.getBoolean(R.styleable.CustomTitleBar_tlb_right_button_visible, true);
- if (rightButtonVisible) {
- titleBarRightBtn.setVisibility(View.VISIBLE);
- } else {
- titleBarRightBtn.setVisibility(View.INVISIBLE);
- }
- //设置右边按钮的文字
- String rightButtonText = attributes.getString(R.styleable.CustomTitleBar_tlb_right_button_text);
- if (!TextUtils.isEmpty(rightButtonText)) {
- titleBarRightBtn.setText(rightButtonText);
- //设置右边按钮文字颜色
- int rightButtonTextColor = attributes.getColor(R.styleable.CustomTitleBar_tlb_right_button_text_color, Color.WHITE);
- titleBarRightBtn.setTextColor(rightButtonTextColor);
- }
- //设置右边图片icon 这里是二选一 要么只能是文字 要么只能是图片
- int rightButtonDrawable = attributes.getResourceId(R.styleable.CustomTitleBar_tlb_right_button_drawable, -1);
- if (rightButtonDrawable != -1) {
- titleBarRightBtn.setCompoundDrawablesWithIntrinsicBounds(0, 0, rightButtonDrawable, 0); //设置到哪个控件的位置()
- }
- attributes.recycle();
- }
- }
-
- public void setTitleClickListener(OnClickListener onClickListener) {
- if (onClickListener != null) {
- titleBarLeftBtn.setOnClickListener(onClickListener);
- titleBarRightBtn.setOnClickListener(onClickListener);
- }
- }
-
- public Button getTitleBarLeftBtn() {
- return titleBarLeftBtn;
- }
-
- public Button getTitleBarRightBtn() {
- return titleBarRightBtn;
- }
-
- public TextView getTitleBarTitle() {
- return titleBarTitle;
- }
-
- }

4.)在不同的XML布局中引用
关于如何使用自定义属性这里就不再说明了,为了更加直观的查看效果,我这里在一个布局文件中实现不同要求的标题栏
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:lee="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <com.whoislcj.views.CustomTitleBar
- android:layout_width="match_parent"
- android:layout_height="45dp"
- android:layout_marginTop="10dp"
- lee:right_button_drawable="@mipmap/titlebar_add_icon"
- lee:title_background_color="@color/green"
- lee:title_text="标题1" />
-
- <com.whoislcj.views.CustomTitleBar
- android:layout_width="match_parent"
- android:layout_height="45dp"
- android:layout_marginTop="10dp"
- lee:right_button_visible="false"
- lee:title_background_color="@color/green"
- lee:title_text="标题2" />
-
- <com.whoislcj.views.CustomTitleBar
- android:layout_width="match_parent"
- android:layout_height="45dp"
- android:layout_marginTop="10dp"
- lee:left_button_text="左边"
- lee:right_button_text="右边"
- lee:title_background_color="@color/red"
- lee:title_text="标题3" />
-
- <com.whoislcj.views.CustomTitleBar
- android:layout_width="match_parent"
- android:layout_height="45dp"
- android:layout_marginTop="10dp"
- lee:left_button_text="左边"
- lee:right_button_drawable="@mipmap/titlebar_add_icon"
- lee:title_background_color="@color/red"
- lee:title_text="标题4" />
-
- <com.whoislcj.views.CustomTitleBar
- android:layout_width="match_parent"
- android:layout_height="45dp"
- android:layout_marginTop="10dp"
- lee:left_button_text="左边"
- lee:left_button_text_color="@color/red"
- lee:right_button_drawable="@mipmap/titlebar_add_icon"
- lee:title_background_color="@color/blue"
- lee:title_text="标题5" />
-
- <com.whoislcj.views.CustomTitleBar
- android:layout_width="match_parent"
- android:layout_height="45dp"
- android:layout_marginTop="10dp"
- lee:left_button_text="左边"
- lee:left_button_text_color="@color/red"
- lee:right_button_drawable="@mipmap/titlebar_add_icon"
- lee:title_background_color="@color/blue"
- lee:title_text="标题6"
- lee:title_text_color="@color/black" />
-
- </LinearLayout>

显示效果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。