一、先看下效果图(平板上实验不是很清晰):
左边是“Back”按钮,中间是“自定义标题",右边是"More",点击会弹出相应的提示,这里使用Toast提示一个简单的信息作为实例。
二、开发流程:
1、自定义View的属性设置,要在values目录下建立attrs.xml文件,添加属性内容,代码实现如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- declare-styleable自定义属性值 -->
<declare-styleable name="TopBar">
<attr name="title" format="string" />
<attr name="titleTextSize" format="dimension" />
<attr name="titleTextColor" format="color" />
<attr name="leftTextColor" format="color" />
<attr name="leftBackground" format="reference|color" />
<attr name="leftText" format="string" />
<attr name="rightTextColor" format="color" />
<attr name="rightBackground" format="reference|color" />
<attr name="rightText" format="string" />
</declare-styleable>
</resources>
以上配置文件声明了,标题,左button,右button的相关属性
2、在布局文件TopBar.java里添加这些属性:
public class TopBar extends RelativeLayout {
private Button leftButton, rightButton;// 控件的左右边按钮
private TextView titleText;// 标题文字
private String leftText;// 左边的button属性
private int leftTextColor;
private Drawable leftBackground;
private String rightText;// 右边的button属性
private int rightTextColor;
private Drawable rightBackground;
private String title;// 中间标题属性
private int titleTextColor;
private float titleTextSize;
private static int leftBtnId = 1;
private static int titleId = 2;
private static int righBtntId = 3;
TopBarClickListener topBarClickListener;
private LayoutParams leftParams, rightParams, titleParams;// 三个控件的LayoutParams
public TopBar(Context context, AttributeSet attrs) {
super(context, attrs);
// 从参数列表中获取参数
// TypedArray实例是个属性的容器,context.obtainStyledAttributes()方法返回得到。AttributeSet是节点的属性集合
// 第二个参数为 为获取到值时的默认值
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TopBar);
leftText = ta.getString(R.styleable.TopBar_leftText);
leftTextColor = ta.getColor(R.styleable.TopBar_leftTextColor, 0);
leftBackground = ta.getDrawable(R.styleable.TopBar_leftBackground);
rightText = ta.getString(R.styleable.TopBar_rightText);
rightTextColor = ta.getColor(R.styleable.TopBar_rightTextColor, 0);
rightBackground = ta.getDrawable(R.styleable.TopBar_rightBackground);
title = ta.getString(R.styleable.TopBar_title);
titleTextSize = ta.getDimension(R.styleable.TopBar_titleTextSize, 14);
titleTextColor = ta.getColor(R.styleable.TopBar_titleTextColor, 0);
ta.recycle();
leftButton = new Button(context);
rightButton = new Button(context);
titleText = new TextView(context);
leftButton.setId(leftBtnId);
rightButton.setId(righBtntId);
titleText.setId(titleId);
// 为组件配置布局参数
leftParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
rightParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
titleParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
//
leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
addView(leftButton, leftParams);
rightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, TRUE);
addView(rightButton, rightParams);
titleParams.addRule(RelativeLayout.CENTER_IN_PARENT, TRUE);
addView(titleText, titleParams);
leftButton.setTextColor(leftTextColor);
leftButton.setBackgroundDrawable(leftBackground);
leftButton.setText(leftText);
rightButton.setTextColor(rightTextColor);
rightButton.setBackgroundDrawable(rightBackground);
rightButton.setText(rightText);
titleText.setTextColor(titleTextColor);
titleText.setTextSize(titleTextSize);
titleText.setText(title);
titleText.setGravity(Gravity.CENTER);
setBackgroundColor(0xff70A0E9);
leftButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (topBarClickListener != null) {
topBarClickListener.leftBtnClick();
}
}
});
rightButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (topBarClickListener != null) {
topBarClickListener.rightBtnClick();
}
}
});
titleText.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (topBarClickListener != null) {
topBarClickListener.titleClick();
}
}
});
}
/**
* 单击事件监听
*
* @param topBarClickListener
*/
public void setTopBarClickListener(TopBarClickListener topBarClickListener) {
this.topBarClickListener = topBarClickListener;
}
}
上面的文件,添加了声明的各个属性,生成了一个TopBar模版,现在看下这个模版怎么使用。
3、在布局文件里使用设计好的TopBar UI模版:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:custom="http://schemas.android.com/apk/res/com.example.topbarmodle"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="5dp"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<com.example.topbarmodle.TopBar
android:id="@+id/topBar"
android:layout_width="match_parent"
android:layout_height="40dp"
custom:leftText="Back"
custom:leftTextColor="@android:color/black"
custom:rightText="More"
custom:rightTextColor="@android:color/black"
custom:title="自定义标题"
custom:titleTextColor="@android:color/black"
custom:titleTextSize="20sp" >
</com.example.topbarmodle.TopBar>
</RelativeLayout>
注意:(1)在布局文件的xml中com.example.topbarmodle.TopBar显示控件代表的类; (2) xmlns:custom=http://schemas.android.com/apk/res/com.example.topbarmodle是必须添加的,其中com.example.topbarmodle是类的包名,添加后,在custom中添加使用alt+/会自动添加我们定义的相关属性。
4、实现自定义的模版相关属性的监听,这里监听两个button,和title:
public interface TopBarClickListener {
void leftBtnClick();
void titleClick();
void rightBtnClick();
}
这个已经在TopBar.java里已经设置监听相关方法。
5、实现测试类,测试设计效果:
public class MainActivity extends Activity {
private TopBar topBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
topBar = (TopBar) findViewById(R.id.topBar);
topBar.setTopBarClickListener(new TopBarClickListener() {
@Override
public void titleClick() {
Toast.makeText(MainActivity.this, "title", Toast.LENGTH_SHORT).show();
}
@Override
public void rightBtnClick() {
Toast.makeText(MainActivity.this, "More", Toast.LENGTH_SHORT).show();
}
@Override
public void leftBtnClick() {
Toast.makeText(MainActivity.this, "Back", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
整个开发过程到此为止,已经基本实现了相关功能。源码下载:http://download.csdn.net/detail/shizhao0716/8382125