对于上述几张图片,他们都有一个共同点,布局差不多,我们可以把它封装成一个共同的控件,通过自定义属性来控制子控件的显示与否与内容的不同,背景的不同。
- package com.android.custom;
- import android.content.Context;
- import android.content.res.TypedArray;
- import android.graphics.Color;
- import android.graphics.drawable.Drawable;
- import android.text.TextUtils.TruncateAt;
- import android.util.AttributeSet;
- import android.view.Gravity;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.Button;
- import android.widget.RelativeLayout;
- import android.widget.TextView;
- public class TopBar extends RelativeLayout{
- private Button leftBtn,rightBtn;
- private TextView title;
- private TopBarClickListener topBarClickListener;
- private String titleStr;
- private RelativeLayout.LayoutParams leftBtnLayoutParams,rightBtnLayoutParams,titleLayoutParams;
- private static int LEFT_BTN_ID = 1;
- private static int TITLE_ID = 2;
- private static int RIGHT_BTN_ID = 3;
- private Drawable leftBackground,rightBackground;
- private String leftText,rightText;
- private int leftTextColor,rightTextColor,titleTextColor;
- private float titleTextSize;
- public TopBar(Context context,AttributeSet attrs){
- super(context,attrs);
-
- TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.TopBar);
-
- this.titleStr = ta.getString(R.styleable.TopBar_title);
- this.leftBackground = ta.getDrawable(R.styleable.TopBar_leftBackground);
- this.rightBackground = ta.getDrawable(R.styleable.TopBar_rightBackground);
- this.leftText = ta.getString(R.styleable.TopBar_leftText);
- this.rightText = ta.getString(R.styleable.TopBar_rightText);
- this.leftTextColor = ta.getColor(R.styleable.TopBar_leftTextColor, 0);
- this.rightTextColor = ta.getColor(R.styleable.TopBar_rightTextColor, 0);
- this.titleTextSize = ta.getDimension(R.styleable.TopBar_titleTextSize, 14);
- this.titleTextColor = ta.getColor(R.styleable.TopBar_titleTextColor, 0);
-
- ta.recycle();
-
- leftBtn = new Button(context);
- rightBtn = new Button(context);
- title = new TextView(context);
-
- leftBtn.setId(LEFT_BTN_ID);
- rightBtn.setId(RIGHT_BTN_ID);
- title.setId(TITLE_ID);
-
-
-
- leftBtnLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
- rightBtnLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
- titleLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
-
- leftBtnLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT,RelativeLayout.TRUE);
- leftBtnLayoutParams.setMargins(12, 0, 0, 0);//左上右下
- leftBtnLayoutParams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
-
- rightBtnLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,RelativeLayout.TRUE);
- rightBtnLayoutParams.setMargins(12, 0, 0, 0);//左上右下
- rightBtnLayoutParams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
-
- titleLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,RelativeLayout.TRUE);
- titleLayoutParams.setMargins(0, 0, 12, 0);//左上右下
- titleLayoutParams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
- titleLayoutParams.addRule(RelativeLayout.LEFT_OF, RIGHT_BTN_ID);
- titleLayoutParams.addRule(RelativeLayout.RIGHT_OF, LEFT_BTN_ID);
- titleLayoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
-
- addView(leftBtn, leftBtnLayoutParams);
- addView(rightBtn,rightBtnLayoutParams);
- addView(title,titleLayoutParams);
-
- leftBtn.setBackgroundDrawable(leftBackground);
- leftBtn.setText(leftText);
- leftBtn.setTextColor(leftTextColor);
- rightBtn.setBackgroundDrawable(rightBackground);
- rightBtn.setText(rightText);
- rightBtn.setTextColor(rightTextColor);
-
- title.setTextSize(22.0f);
- title.setTextColor(Color.BLUE);
- title.setEllipsize(TruncateAt.MIDDLE);
- title.setGravity(Gravity.CENTER_HORIZONTAL);
- title.setSingleLine(true);
- title.setText(titleStr);
- title.setTextSize(titleTextSize);
- title.setTextColor(titleTextColor);
-
- leftBtn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- if(topBarClickListener!=null){
- topBarClickListener.leftBtnClick();
- }
- }
- });
-
- rightBtn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- if(topBarClickListener!=null){
- topBarClickListener.rightBtnClick();
- }
- }
- });
- }
- public void setTopBarClickListener(TopBarClickListener topBarClickListener) {
- this.topBarClickListener = topBarClickListener;
- }
- }
- package com.android.custom;
- public interface TopBarClickListener {
- void leftBtnClick();
- void rightBtnClick();
- }
- package com.android.custom;
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.Toast;
- public class CustomViewActivity extends Activity{
- private TopBar topBar;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
- topBar = (TopBar)findViewById(R.id.topBar);
- topBar.setTopBarClickListener(new TopBarClickListener() {
- @Override
- public void rightBtnClick() {
- //处理右边按钮所对应的逻辑
- Toast.makeText(CustomViewActivity.this, "你点击的是右边的按钮", Toast.LENGTH_LONG).show();
- }
-
- @Override
- public void leftBtnClick() {
- //处理左边按钮所对应的逻辑
- Toast.makeText(CustomViewActivity.this, "你点击的是左边的按钮", Toast.LENGTH_LONG).show();
- }
- });
- }
- }
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <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="string"/>
- <attr name="leftText" format="string"/>
- <attr name="rightTextColor" format="color"/>
- <attr name="rightBackground" format="string"/>
- <attr name="rightText" format="string"/>
- </declare-styleable>
- </resources>
- <?xml version="1.0" encoding="utf-8"?>
- <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:custom="http://schemas.android.com/apk/res/com.android.custom"
- android:orientation="vertical" android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TextView android:layout_width="fill_parent"
- android:layout_height="fill_parent" android:background="#ff00ff00" />
- <com.android.custom.TopBar android:id="@+id/topBar"
- custom:title="自定义标题" custom:titleTextSize="14.0sp" custom:titleTextColor="#ff0000" android:layout_width="fill_parent"
- custom:leftBackground="@drawable/icon" custom:rightBackground="@drawable/icon"
- custom:leftText="左侧" custom:rightText="右侧"
- custom:leftTextColor="#123123" custom:rightTextColor="#ff0000"
- android:layout_height="wrap_content" android:background="#0000ff">
- </com.android.custom.TopBar>
- </FrameLayout>