欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android 创建自定义View 实现TopBar

程序员文章站 2022-06-09 09:29:44
...

在Android 应用开发中常常使用到自定义,我想自定义一个TopBar(左右两边分别是一个Button 中间是一个TextView ) 定义方法

 

1.首先增加自定义属性,创建一个 attrs.xml文件,分别定义了以下需要使用的属性

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="Topbar" >
        <attr name="title" format="string" />
        <attr name="titleTextSize" format="dimension" />
        <attr name="titleColor" format="color" />
        <attr name="leftText" format="string" />
        <attr name="leftTextColor" format="color" />
        <attr name="leftBackground" format="reference|color"/>
        <attr name="RightText" format="string" />
        <attr name="RightTextColor" format="color" />
        <attr name="RightBackground" format="reference|color"/>  
    </declare-styleable>
    
</resources>

 2.实现一个自定义View 对象TopBar.java 继承ReleativeLayout

package com.test.customview;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;

@SuppressLint("NewApi")
public class TopBar extends RelativeLayout{
	
	/**
	 * 创建的自定义属性
	 */
	private TextView mTitleText;
	private Button mLeftBtn;
	private Button mRightBtn;
	
	private String mTitle;
	private int  mTitleColor;
	private float  mTitleTextSize;
	
	private String mLeftText;
	private Drawable mleftBackgound;
	private int mLeftTextColor;
	
	private String mRightText;
	private Drawable mRightBackgound;
	private int mRightTextColor;
	
	private LayoutParams mLeftParams,mRightParams,mTitleParams;
	private OnclickListener listener;
	
	/**
	 * 定义一个点击事件的回调接口
	 * @author acer
	 *
	 */
	public interface OnclickListener{
		public void leftListener();
		public void rightListener();
	}
	
	/**
	 * 设置点击事件接口回调
	 * @param listener
	 */
	public void setOnclickListener(OnclickListener listener){
		this.listener = listener;
	}

	public TopBar(Context context, AttributeSet attrs) {
		super(context, attrs);
		TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.Topbar);
		
		//获取在attrs.xml中自定义的属性值
		mTitle = ta.getString(R.styleable.Topbar_title);
		mTitleColor = ta.getColor(R.styleable.Topbar_titleColor, 0);
		mTitleTextSize = ta.getDimension(R.styleable.Topbar_titleTextSize, 0);
		
		mLeftText = ta.getString(R.styleable.Topbar_leftText);
		mLeftTextColor = ta.getColor(R.styleable.Topbar_leftTextColor, 0);
		mleftBackgound = ta.getDrawable(R.styleable.Topbar_leftBackground);
		
		mRightBackgound = ta.getDrawable(R.styleable.Topbar_RightBackground);
		mRightText = ta.getString(R.styleable.Topbar_RightText);
		mRightTextColor = ta.getInt(R.styleable.Topbar_RightTextColor, 0);
		
		ta.recycle();
		
		mTitleText = new TextView(context);
		mLeftBtn = new Button(context);
		mRightBtn = new Button(context);
		
		mTitleText.setText(mTitle);
		mTitleText.setBackgroundColor(mTitleColor);
		mTitleText.setTextSize(mTitleTextSize);
		mTitleText.setGravity(Gravity.CENTER);
		
		mLeftBtn.setBackground(mleftBackgound);
		mLeftBtn.setText(mLeftText);
		mLeftBtn.setTextColor(mLeftTextColor);
		
		mRightBtn.setBackground(mRightBackgound);
		mRightBtn.setText(mRightText);
		mRightBtn.setTextColor(mRightTextColor);
		
		setBackgroundColor(0xFF58543);
		
		//设置控件的参数值
		mLeftParams = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
		mLeftParams.addRule(ALIGN_PARENT_LEFT,TRUE);
		mRightParams = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
		mRightParams.addRule(ALIGN_PARENT_RIGHT,TRUE);
		mTitleParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT);
		mTitleParams.addRule(CENTER_IN_PARENT, TRUE);
		//将定义的 控件键加入到ReleativeLayout中
		addView(mLeftBtn, mLeftParams);
		addView(mRightBtn,mRightParams);
		addView(mTitleText,mTitleParams);
		
		mLeftBtn.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				//回调onclick事件传给显示层处理不同的逻辑
				listener.leftListener();
			}
		});
		
		mRightBtn.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				listener.rightListener();
			}
		});
	}


}

 3.在xml文件中引入定义好的控件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res/com.test.customview"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.test.customview.TopBar
        android:id="@+id/topbar"
        android:layout_width="match_parent"
        android:layout_height="35dp"
        custom:title="标题"
        custom:titleTextSize="10sp"
        custom:titleColor="#FFFFFF"
        custom:leftText="back"
        custom:leftTextColor="#FFFFFF"
        custom:leftBackground="@drawable/ic_launcher"
        custom:RightText="more"
        custom:RightTextColor="#FFFFFF"
        custom:RightBackground="@drawable/ic_launcher"
        >
    </com.test.customview.TopBar>    

</RelativeLayout>

 4.在Activity 中加入该布局文件,并处理相关点击事件

package com.test.customview;

import com.test.customview.TopBar.OnclickListener;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		TopBar  topBar = (TopBar) findViewById(R.id.topbar);
		//这里处理Button的点击事件
		topBar.setOnclickListener(new OnclickListener() {
			
			@Override
			public void rightListener() {
				Toast.makeText(MainActivity.this, "click left button", Toast.LENGTH_LONG).show();
			}
			
			@Override
			public void leftListener() {
				Toast.makeText(MainActivity.this, "click right button", Toast.LENGTH_LONG).show();

			}
		});
	}


}

 自此一个TopBar 的自定义控件完成,在不同的Activity布局中直接使用即可。