开发过程中会遇见很多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>