自定义组合控件的属性复用
2018-07-29 本文已影响1人
最黑暗的自己
1、自定义layout
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android:background="@color/colorPrimary"
android:orientation="horizontal"
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="50dp">
<Button
android:background="@null"
android:layout_marginLeft="10dp"
android:layout_alignParentLeft="true"
android:id="@+id/bt_back"
android:text="返回"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/bar_title"
android:textSize="20dp"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:text="2222222"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:background="@null"
android:layout_marginRight="10dp"
android:layout_alignParentRight="true"
android:id="@+id/bt_in"
android:text="前进"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
2、自定义View
public class MyTitleBar extends RelativeLayout {
private String mMyBarTitle;
private int mMyBarSize;
public MyTitleBar(Context context) {
this(context,null);
}
public MyTitleBar(Context context, AttributeSet attrs) {
this(context,attrs,0);
}
public MyTitleBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MyTitleBar, defStyleAttr, 0);
int count = typedArray.getIndexCount();
for (int i=0;i<count;i++){
int attr = typedArray.getIndex(i);
switch (attr){
case R.styleable.MyTitleBar_bar_title:
mMyBarTitle = typedArray.getString(attr);
break;
case R.styleable.MyTitleBar_bar_title_size:
mMyBarSize = typedArray.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));
break;
}
}
typedArray.recycle();
initView(context);
}
private void initView(final Context context) {
LayoutInflater.from(context).inflate(R.layout.mytitlebar,this);
TextView bar_title = findViewById(R.id.bar_title);
Button bt_back = findViewById(R.id.bt_back);
bt_back.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//调用接口的方法
titleBarClickListener.titleBarClicker(v);
}
});
bar_title.setText(mMyBarTitle);
bar_title.setTextSize(mMyBarSize);
}
//定义接口的成员
onTitleBarClickListener titleBarClickListener;
//接口的setter,提供给外部的方法
public void setonTitleBarClickListener(onTitleBarClickListener titleBarClickListener){
//在setter中把这个接口的实现赋值给这个loginview的上面定义的接口
this.titleBarClickListener=titleBarClickListener;
}
//接口 连接内部与外部
public interface onTitleBarClickListener{
public void titleBarClicker(View v);
}
}
3、自定义attrs
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="bar_title" format="string"/>
<attr name="bar_title_size" format="dimension"/>
<declare-styleable name="MyTitleBar">
<attr name="bar_title"/>
<attr name="bar_title_size"/>
</declare-styleable>
</resources>
4、使用
<?xml version="1.0" encoding="utf-8"?>
<com.example.intercept.MyRelative
android:id="@+id/rl_root"
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"
tools:context="com.example.intercept.MainActivity">
<com.example.intercept.MyView.MyTitleBar
android:id="@+id/mytitlebar"
app:bar_title="标题栏"
app:bar_title_size="16sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"></com.example.intercept.MyView.MyTitleBar>
<com.example.intercept.MyImageView
android:id="@+id/iv"
android:layout_centerInParent="true"
android:layout_width="100dp"
android:src="@mipmap/ic_launcher"
android:layout_height="100dp" />
</com.example.intercept.MyRelative>
5、点击事件的获取
MyTitleBar mytitlebar = findViewById(R.id.mytitlebar);
mytitlebar.setonTitleBarClickListener(new MyTitleBar.onTitleBarClickListener() {
@Override
public void titleBarClicker(View v) {
if (v.getId()==R.id.bt_back){
finish();
}
}
});