1.在res/values下面新建一个xml文件attrs.xml,里面放的是自定义View的各种属性
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ToBarView">
<!-- 左边按钮 -->
<attr name="leftBtnText" format="string"/>
<attr name="leftBtnTextSize" format="dimension"/>
<attr name="leftBtnTextColor" format="color"/>
<attr name="leftBinBackGround" format="color|reference"/>
<!-- 标题 -->
<attr name="titleText" format="string"/>
<attr name="titleTextSizt" format="dimension"/>
<attr name="titleTextColor" format="color"/>
<attr name="titleBackGround" format="color|reference"/>
<!-- 右边按钮 -->
<!-- 左边按钮 -->
<attr name="rightBtnText" format="string"/>
<attr name="rightBtnTextSize" format="dimension"/>
<attr name="rightBtnTextColor" format="color"/>
<attr name="rightBinBackGround" format="color|reference"/>
<!-- 标题 -->
</declare-styleable>
</resources>
2.新建一个Class类TopBarView继承自RelativeLayout,并实现里面的两个构造方法。
package topteam.com.activity_demo.diyview;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
import topteam.com.activity_demo.R;
public class TopBarView extends RelativeLayout {
//子控件
private Button leftBtn_v;
private Button rightBtn_v;
private TextView titleText_v;
//左边按钮
private Drawable leftBtnBackGround;
private String leftBtnText;
private int leftBtnTextColor;
private float leftBtnTextSize;
//标题
private int titleTextColor;
private float titleTextSize;
private int titleBackGround;
private String titleTextString;
//右边按钮
private Drawable rightBtnBackGround;
private String rightBtnText;
private int rightBtnTextColor;
private float rightBtnTextSize;
private LayoutParams leftLp;
private LayoutParams titleLp;
private LayoutParams rightLp;
private OnClickListeners onClickListeners;
public TopBarView(Context context) {
super(context);
}
public TopBarView(Context context, AttributeSet attrs) {
super(context, attrs);
//获取资源文件所定义的属性
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.ToBarView);
//左边按钮
leftBtnBackGround = ta.getDrawable(R.styleable.ToBarView_leftBinBackGround);
leftBtnTextColor = ta.getColor(R.styleable.ToBarView_leftBtnTextColor, 0);
leftBtnText = ta.getString(R.styleable.ToBarView_leftBtnText);
leftBtnTextSize = ta.getDimension(R.styleable.ToBarView_leftBtnTextSize, 10);
//标题
titleBackGround = ta.getColor(R.styleable.ToBarView_titleBackGround, 0);
titleTextString = ta.getString(R.styleable.ToBarView_titleText);
titleTextSize = ta.getDimension(R.styleable.ToBarView_titleTextSizt, 10);
titleTextColor = ta.getColor(R.styleable.ToBarView_titleTextColor, 0);
//右边按钮
rightBtnBackGround = ta.getDrawable(R.styleable.ToBarView_rightBinBackGround);
rightBtnText = ta.getString(R.styleable.ToBarView_rightBtnText);
rightBtnTextColor = ta.getColor(R.styleable.ToBarView_rightBtnTextColor, 0);
rightBtnTextSize = ta.getDimension(R.styleable.ToBarView_rightBtnTextSize, 10);
ta.recycle();
leftBtn_v = new Button(context);
titleText_v = new TextView(context);
rightBtn_v = new Button(context);
//左按钮赋值
leftBtn_v.setText(leftBtnText);
leftBtn_v.setBackground(leftBtnBackGround);
leftBtn_v.setTextColor(leftBtnTextColor);
leftBtn_v.setTextSize(leftBtnTextSize);
//标题赋值
titleText_v.setBackgroundColor(titleBackGround);
titleText_v.setText(titleTextString);
titleText_v.setTextSize(titleTextSize);
titleText_v.setTextColor(titleTextColor);
//右按钮赋值
rightBtn_v.setText(rightBtnText);
rightBtn_v.setBackground(rightBtnBackGround);
rightBtn_v.setTextSize(rightBtnTextSize);
titleText_v.setTextColor(rightBtnTextColor);
//左按钮摆放位置
leftLp = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.MATCH_PARENT);
leftLp.addRule(RelativeLayout.ALIGN_LEFT,TRUE);
addView(leftBtn_v,leftLp);
//标题摆放位置
titleLp = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
titleLp.addRule(RelativeLayout.CENTER_IN_PARENT,TRUE);
titleText_v.setGravity(Gravity.CENTER);
addView(titleText_v,titleLp);
//右按钮摆放位置
rightLp = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.MATCH_PARENT);
rightLp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,TRUE);
addView(rightBtn_v,rightLp);
//左按钮点击事件
leftBtn_v.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onClickListeners.leftBtnOnClickListener();
}
});
//右按钮点击事件
rightBtn_v.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onClickListeners.rightBtnOnClickListener();
}
});
}
//定义一个接口来实现两个按钮的点击事件回调
public interface OnClickListeners{
void leftBtnOnClickListener();
void rightBtnOnClickListener();
}
//暴露一个方法给调用者
public void setOnClickListeners(OnClickListeners onClickListeners){
this.onClickListeners = onClickListeners;
}
}
3.定义两个按钮的样式,点击的时候需要变色,在drawable文件中新建一个可绘制资源文件mybutton.xml.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<solid android:color="#ff00ff"/>
</shape>
</item>
<item >
<color android:color="@color/colorAccent"/>
</item>
</selector>
4.在布局文件中直接调用,并给控件赋值
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:mytobar="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<topteam.com.activity_demo.diyview.TopBarView
android:id="@+id/topbar"
android:layout_width="match_parent"
android:layout_height="38dp"
mytobar:leftBtnText="返回"
mytobar:leftBinBackGround="@drawable/mybutton"
mytobar:leftBtnTextSize="12px"
mytobar:leftBtnTextColor="#000"
mytobar:titleText="自定义标题"
mytobar:titleTextSizt="15px"
mytobar:titleTextColor="#000"
mytobar:titleBackGround="#fff000"
mytobar:rightBtnText="前进"
mytobar:rightBinBackGround="@drawable/mybutton"
mytobar:rightBtnTextSize="12px"
mytobar:rightBtnTextColor="#000"
>
</topteam.com.activity_demo.diyview.TopBarView>
</LinearLayout>
5.Java主程序
package topteam.com.activity_demo.diyview;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import topteam.com.activity_demo.R;
public class MyTopBarView extends AppCompatActivity {
private TopBarView topBarView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_top_bar_view);
topBarView = findViewById(R.id.topbar);
topBarView.setOnClickListeners(new TopBarView.OnClickListeners() {
@Override
public void leftBtnOnClickListener() {
Toast.makeText(MyTopBarView.this, "点击了左按钮", Toast.LENGTH_SHORT).show();
}
@Override
public void rightBtnOnClickListener() {
Toast.makeText(MyTopBarView.this, "点击了右按钮", Toast.LENGTH_SHORT).show();
}
});
}
}