提高UI布局代码的复用性,与代码高度解耦
一、创建一个需要自定义的布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="match_parent">
android:id="@+id/custom_left_btn"
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:gravity="center"
android:minHeight="45dp"
android:minWidth="45dp"
android:textSize="14sp"
/>
android:id="@+id/custom_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center"
android:lines="1"
android:ellipsize="end"
android:textSize="17sp"/>
android:id="@+id/custom_right_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="7dp"
android:background="@null"
android:minWidth="45dp"
android:minHeight="45dp"
android:textSize="14sp"/>
</RelativeLayout>
二、定义自定义需要的属性,在values下创建一个命名为attrs的xml属性文件
<declare-styleable name="CustomTitleBar">
<attr name="title_background_color" format="integer|reference"/>
<attr name="title_text" format="string"/>
<attr name="title_text_color" format="color"/>
<attr name="title_text_drawable" format="reference|integer"/>
<attr name="left_button_text" format="string"/>
<attr name="left_button_text_color" format="color"/>
<attr name="left_button_text_drawable" format="reference|integer"/>
<attr name="right_button_text" format="string"/>
<attr name="right_button_text_color" format="color"/>
<attr name="right_button_text_drawable" format="reference|integer"/>
<attr name="left_button_visible" format="boolean"/>
<attr name="right_button_visible" format="boolean"/>
</declare-styleable>
三、新建类继承一个ViewGroup,设置好相应的属性值。这里继承的是RelativeLayout
public class CustomTitleBarextends RelativeLayout {
private ButtoncustomLeftBtn,customRightBtn;
private TextViewcustomTitle;
public CustomTitleBar(Context context) {
super(context);
}
/**
* 在这个构造方法中初始化控件
* @param context
* @param attrs
*/
public CustomTitleBar(Context context, AttributeSet attrs) {
super(context, attrs);
//初始化布局和控件
LayoutInflater.from(context).inflate(R.layout.custom_title_bar,this,true);
customLeftBtn=findViewById(R.id.custom_left_btn);
customRightBtn=findViewById(R.id.custom_right_btn);
customTitle=findViewById(R.id.custom_title);
//获取属性值数组,将xml设置的属性值绑定
TypedArray attributes=context.obtainStyledAttributes(attrs,R.styleable.CustomTitleBar);
Log.i("CustomTitleBar", String.valueOf(attributes!=null));
//判断属性数组是否为空
if (attributes!=null){
//处理titlebar的背景颜色,获取设置的背景颜色,如果没有设置,则默认为绿色
int titleBarBackground=attributes.getResourceId(R.styleable.CustomTitleBar_title_background_color,Color.GREEN);
setBackgroundResource(titleBarBackground);//设置titlebar背景颜色
//从左到右,先处理左边的按钮属性
//获取是否要显示左边按钮
boolean customLeftBtnVisible=attributes.getBoolean(R.styleable.CustomTitleBar_left_button_visible,true);
if (customLeftBtnVisible){
customLeftBtn.setVisibility(View.VISIBLE);
}else {
customLeftBtn.setVisibility(View.GONE);
}
//设置左边按钮文字
String customLeftBtnText=attributes.getString(R.styleable.CustomTitleBar_left_button_text);
//判断是否有设置文字
if (!TextUtils.isEmpty(customLeftBtnText)){
customLeftBtn.setText(customLeftBtnText);
//然后再设置文字的颜色
int customLeftBtnTextColor=attributes.getColor(R.styleable.CustomTitleBar_left_button_text_color,Color.WHITE);
customLeftBtn.setTextColor(customLeftBtnTextColor);
}else {//如果左边按钮设置的不是文字,那只能设置icon了
//设置左边图片icon 这里是二选一 要么只能是文字 要么只能是图片
int customLeftBtnDrawable=attributes.getResourceId(R.styleable.CustomTitleBar_left_button_text_drawable,R.drawable.titlebar_back);
if (customLeftBtnDrawable!=-1){//判断是否有设置图标
customLeftBtn.setBackgroundResource(customLeftBtnDrawable);
}
}
//处理中间的标题TextView
//先获取标题是否要显示图标icon
int customTitleDrawable=attributes.getResourceId(R.styleable.CustomTitleBar_title_text_drawable,-1);
if (customTitleDrawable!=-1){
customTitle.setBackgroundResource(customTitleDrawable);
}else{
//如果没有设置图标,则获取文字标题
String customTitleText=attributes.getString(R.styleable.CustomTitleBar_title_text);
if (!TextUtils.isEmpty(customTitleText)){
customTitle.setText(customTitleText);
}
//设置标题字体颜色
int customTitleColor=attributes.getColor(R.styleable.CustomTitleBar_title_text_color,Color.WHITE);
customTitle.setTextColor(customTitleColor);
}
//处理右边按钮
//判断是否显示右边按钮
boolean customRightBtnVisible=attributes.getBoolean(R.styleable.CustomTitleBar_right_button_visible,true);
if (customRightBtnVisible){
customRightBtn.setVisibility(View.VISIBLE);
}else {
customRightBtn.setVisibility(View.GONE);
}
//设置右边按钮的文字
String customRightBtnText=attributes.getString(R.styleable.CustomTitleBar_right_button_text);
if (!TextUtils.isEmpty(customRightBtnText)){
customRightBtn.setText(customRightBtnText);
//设置文字字体颜色
int customRightBtnColor=attributes.getColor(R.styleable.CustomTitleBar_right_button_text_color,Color.WHITE);
customRightBtn.setTextColor(customRightBtnColor);
}else {
//如果没有设置文字,则设置图片,只有这两个选择
int customRightBtnDrawable=attributes.getResourceId(R.styleable.CustomTitleBar_right_button_text_drawable,R.drawable.titlebar_add);
if (customRightBtnDrawable!=-1){
customRightBtn.setBackgroundResource(customRightBtnDrawable);
}
}
attributes.recycle();//最后得释放内存对象
}
}
//为左右两边的按钮设置点击监听事件
/**
* 为左右两边的按钮分别设置点击事件
* @param onClickListener
*/
public void setTitleClickListener(OnClickListener onClickListener){
if (onClickListener!=null){
customLeftBtn.setOnClickListener(onClickListener);
customRightBtn.setOnClickListener(onClickListener);
}
}
/**
* 获得左边按钮
* @return
*/
public ButtongetCustomLeftBtn(){
return customLeftBtn;
}
/**
* 获得右边按钮
*/
public ButtongetCustomRightBtn(){
return customRightBtn;
}
/**
* 获得标题文本控件
*/
public TextViewgetCustomTitle(){
return customTitle;
}
}
四、最后在需要用到的布局上面设置就行了,这里需要注意的是app自定义属性值的路径:
xmlns:app="http://schemas.android.com/apk/res-auto",在最外层的布局上得加上这个。
<com.example.liyun.customtitlebar.CustomTitleBar
android:id="@+id/toolbar_a"
android:layout_width="match_parent"
android:layout_height="?actionBarSize"
app:left_button_text="返回"
app:title_background_color="@color/red"
app:title_text="中间标题1"
app:right_button_text_drawable="@mipmap/titlebar_right"
android:layout_marginBottom="5dp"
/>
到这里一个自定义的标题控件就完成了,还有那些需要注意不对的地方,请指正,谢谢
网友评论