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布局中直接使用即可。
推荐阅读
-
Android编程实现自定义分享列表ACTION_SEND功能的方法
-
Android自定义ViewPagerIndicator实现炫酷导航栏指示器(ViewPager+Fragment)
-
Android开发实现popupWindow弹出窗口自定义布局与位置控制方法
-
Android使用Sensor感应器实现线程中刷新UI创建android测力计的功能
-
android自定义View滑动删除效果
-
Android编程使用自定义shape实现shadow阴影效果的方法
-
Android自定义View仿华为圆形加载进度条
-
Android自定义ViewGroup实现堆叠头像的点赞Layout
-
Android 使用自定义RecyclerView控件实现Gallery效果
-
Android自定义Drawable实现圆形和圆角