Android 自定义控件详解

来源:互联网 发布:darma 知乎 编辑:程序博客网 时间:2024/06/10 17:06

我们在开发工程中有时系统自带的控件已经满足不了我们的需求,这是我们就需要设计自己的控件。这里给大家介绍一个通用导航栏控件。

一、设计我们在布局文件中所需要使用的属性

1、在res\values文件夹下新建一个atts.xml文件。

2、添加自定义控件中各部分组件的属性,代码如下:

<?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"/>        <!-- 设置背景时,颜色合适使用@color/xx和#bbb -->        <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>
二、实现一个我们的控件

1、新建一个我们的控件类。

2、在控件类中来实现我们空间所需要的功能及属性,下面代码中有详细的注释这里就不再多说。

package com.cx.mytopbar;import android.annotation.TargetApi;import android.content.Context;import android.content.res.TypedArray;import android.graphics.drawable.Drawable;import android.os.Build;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 leftButton;private Button rightButton;private TextView tvTitle;//声明左侧按钮属性private int leftTextColor;private Drawable leftBackground;private String leftText;//声明右侧按钮属性private int rightTextColor;private Drawable rightBackground;private String rightText;//声明文本属性private float titleTextSize;private int titleTextColor;private String title;//定义布局属性private LayoutParams leftParams;private LayoutParams rightParams;private LayoutParams titleParams;private topbarClickListener listener;//创建按钮点击事件接口public interface topbarClickListener{//定义两个方法,左右按钮点击事件public void leftClick();public void rightClick();};//暴露点击方法public void setOnTopbarClickListener(topbarClickListener listener){this.listener = listener;}@TargetApi(Build.VERSION_CODES.JELLY_BEAN)public Topbar(Context context, AttributeSet attrs) {super(context, attrs);//获取自定义属性TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.Topbar);//取出布局文件中设置的属性值,第一个参数为对应的key,第二个参数给一个默认值0leftTextColor = ta.getColor(R.styleable.Topbar_leftTextColor, 0);leftBackground = ta.getDrawable(R.styleable.Topbar_leftBackground);leftText = ta.getString(R.styleable.Topbar_leftText);rightTextColor = ta.getColor(R.styleable.Topbar_rightTextColor, 0);rightBackground = ta.getDrawable(R.styleable.Topbar_rightBackground);rightText = ta.getString(R.styleable.Topbar_rightText);titleTextSize = ta.getDimension(R.styleable.Topbar_titleTextSize, 0);titleTextColor = ta.getColor(R.styleable.Topbar_titleTextColor, 0);title = ta.getString(R.styleable.Topbar_title);//回收,避免浪费资源和避免缓存带来的错误ta.recycle();//实例化控件leftButton = new Button(context);rightButton = new Button(context);tvTitle = new TextView(context);//将属性赋值给控件leftButton.setTextColor(leftTextColor);leftButton.setBackground(leftBackground);leftButton.setText(leftText);rightButton.setTextColor(rightTextColor);rightButton.setBackground(rightBackground);rightButton.setText(rightText);tvTitle.setTextSize(titleTextSize);tvTitle.setTextColor(titleTextColor);tvTitle.setText(title);tvTitle.setGravity(Gravity.CENTER);//设置文字居中//为了美观,设置一个整体的背景颜色setBackgroundColor(0xFFF59563);//初始化布局属性(宽,高)leftParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);//设置控件居左leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, TRUE);//将左侧控件添加到布局中addView(leftButton, leftParams);//添加右侧按钮rightParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);rightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, TRUE);addView(rightButton, rightParams);//添加文本titleParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);titleParams.addRule(RelativeLayout.CENTER_IN_PARENT, TRUE);addView(tvTitle, titleParams);//增加按钮点击事件leftButton.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stublistener.leftClick();}});rightButton.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stublistener.rightClick();}});}//增加按钮是否显示方法public void setLeftVisibility(boolean flag){if(flag){leftButton.setVisibility(View.VISIBLE);}else{leftButton.setVisibility(View.GONE);}}public void setRightVisibility(boolean flag){if(flag){rightButton.setVisibility(View.VISIBLE);}else{rightButton.setVisibility(View.GONE);}}}
三、在布局文件中引用我们的控件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:custom="http://schemas.android.com/apk/res/com.cx.mytopbar"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent" >    <com.cx.mytopbar.Topbar         android:id="@+id/topbar"        android:layout_width="match_parent"        android:layout_height="47dp"        custom:leftText="Back"        custom:leftTextColor="#FFF"        custom:leftBackground="@drawable/btn_back"        custom:rightTextColor="#FFF"        custom:rightText="More"        custom:rightBackground="@drawable/btn_back"        custom:title="自定义标题"        custom:titleTextColor="#123412"        custom:titleTextSize="20sp">    </com.cx.mytopbar.Topbar></RelativeLayout>
注意:要增加命名空间,res/后面为自定义控件包名,并修改别名。在studio中直接在res后面加-auto就可以了。

xmlns:custom="http://schemas.android.com/apk/res/com.cx.mytopbar"
四、在在Java类中使用控件
package com.cx.mytopbar;import android.app.Activity;import android.os.Bundle;import android.widget.Toast;import com.cx.mytopbar.Topbar.topbarClickListener;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);//增加Topbar的点击事件topbar.setOnTopbarClickListener(new topbarClickListener(){@Overridepublic void leftClick() {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "点击了左侧按钮!", Toast.LENGTH_SHORT).show();}@Overridepublic void rightClick() {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "点击了右侧按钮!", Toast.LENGTH_SHORT).show();}});//设置右侧按钮不显示topbar.setRightVisibility(false);}}
源码下载

0 0
原创粉丝点击