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
- Android 自定义控件详解
- Android 自定义控件 详解
- Android自定义控件详解
- 【Android】Android自定义控件详解
- android自定义控件属性详解
- Android自定义控件属性详解
- android自定义控件属性详解
- 关于Android自定义控件详解
- Android自定义控件属性详解
- android自定义控件属性详解
- Android 自定义控件写法详解
- Android自定义控件方法详解
- android自定义控件属性详解
- Android控件架构与自定义控件详解
- Android控件架构与自定义控件详解
- Android控件架构与自定义控件详解
- Android 控件架构与自定义控件详解
- android自定义控件滑动开关详解
- JRE与JVM、JDK的区别
- R语言-向量构造 及 函数构造
- CSocket建立TCP连接
- Python高级编程之数据库sqlite3(二)
- nginx + tomcat7 配置集群环境 Windows
- Android 自定义控件详解
- Matlab 读取文件夹里所有的文件
- Java技术_每天掌握一种设计模式(001)_设计模式概念及分类
- Linux下获取本地IP地址--------getifaddrs
- synchronized 与 Lock 的那点事
- shell中数学运算
- HttpWebRequest读取网页源码转字符串不完整问题
- tomcat端口被占用解决
- js获取ul的方法