Android(安卓)创建自定义View 实现TopBar
16lz
2021-12-04
在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() {@Overridepublic void onClick(View v) {//回调onclick事件传给显示层处理不同的逻辑listener.leftListener();}});mRightBtn.setOnClickListener(new OnClickListener() {@Overridepublic 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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TopBar topBar = (TopBar) findViewById(R.id.topbar);//这里处理Button的点击事件topBar.setOnclickListener(new OnclickListener() {@Overridepublic void rightListener() {Toast.makeText(MainActivity.this, "click left button", Toast.LENGTH_LONG).show();}@Overridepublic void leftListener() {Toast.makeText(MainActivity.this, "click right button", Toast.LENGTH_LONG).show();}});}}
自此一个TopBar 的自定义控件完成,在不同的Activity布局中直接使用即可。
更多相关文章
- Android布局之RelativeLayout学习
- 转 Android(安卓)Animation学习笔记
- Android六大基本布局详解
- 如何在XML设定android控件的颜色(十六进制颜色码)
- Android(安卓)Drawable系列(1):自定义背景以及注意事项
- listView的item中有checkbox,导致setOnItemClick失效的原因及解决
- 解决android listview中OnItemClickListener事件和里面button点
- android布局属性详解
- 系出名门Android(5) - 控件(View)之TextView, Button, ImageButt