文档章节

Android 自定义控件

超级大富
 超级大富
发布于 2013/12/18 21:06
字数 889
阅读 7154
收藏 82

用到的图片文件:

平时都是用简单的控件通过布局来组合一大堆控件,界面复杂起来的话,布局文件就很大,维护起来也很烦。就想把常用的控件组合写成自定义控件,这样维护起来也方便,代码也清爽,下面就以带消除按钮的EditText为例。平时,EditText删除输入的都是按好多下删除键的,看到很多应用的输入框,在输入内容后,会跳出一个清空按钮,点击一下,输入的都会清除,这个用户体验很好。自己尝试了一下,原先是用最简单的控件组合,发现代码量太大,重用性不高,所以想把这个封装成一个自定义控件,直接调用。直接上代码。

    EditTextWithClearButton.java

import xidian.wwf.temperature.R;
import xidian.wwf.temperature.util.StringUtil;
import android.content.Context;
import android.content.res.TypedArray;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;

/**
 * 带清除按钮的输入框
 * @author WWF
 */
public class EditTextWithClearButton extends LinearLayout{
	
	private EditText editText;
	private ImageButton clearImageButton;

	public EditTextWithClearButton(Context context) {
		super(context);
	}
	
	public EditTextWithClearButton(Context context,AttributeSet attrs){
		super(context, attrs);
		init(context,attrs);
	}
	
	/**
	 * 初始化
	 */
	public void init(Context context,AttributeSet attrs){
		View view = LayoutInflater.from(context).inflate(R.layout.weight_edit_with_clear, this, true);
		editText = (EditText) view.findViewById(R.id.et);
		clearImageButton = (ImageButton) view.findViewById(R.id.clear_ib);
		clearImageButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				editText.setText("");
			}
		});
		editText.addTextChangedListener(new TextWatcher() {
			
			@Override
			public void onTextChanged(CharSequence s, int start, int before, int count) {
				if (s.length() > 0) {
					clearImageButton.setVisibility(View.VISIBLE);
				} else {
					clearImageButton.setVisibility(View.GONE);
				}
			}
			
			@Override
			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
				
			}
			@Override
			public void afterTextChanged(Editable s) {
				
			}
		});
		//将属性值设置到控件中
		TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.EditWithClearText);
		CharSequence hint = a.getText(R.styleable.EditWithClearText_hint);
		CharSequence text = a.getText(R.styleable.EditWithClearText_text);
		if (text!=null&&!StringUtil.isEmpty(text.toString().trim())) {
			editText.setText(text);
			//设置光标位置
			editText.setSelection(text.length());
			this.clearImageButton.setVisibility(View.VISIBLE);
		}else {
			if (hint!=null&&!StringUtil.isEmpty(hint.toString().trim())) {
				editText.setHint(hint);
			}
		}
		a.recycle();
	}
	
	/**
	 * 获得输入的值
	 * @return
	 */
	public String getText(){
		return this.editText.getText().toString();
	}
	
	/**
	 * 设置值
	 * @param text
	 */
	public void setText(String text){
		this.editText.setText(text);
	}
	
	/**
	 * 设置默认值
	 * @param hint
	 */
	public void setHint(String hint){
		this.editText.setHint(hint);
	}
	
	/**
	 * 获得输入框控件
	 * @return
	 */
	public EditText getEditText(){
		return this.editText;
	}
	
	/**
	 * 获得消除按钮
	 * @return
	 */
	public ImageButton getClearImageButton(){
		return this.clearImageButton;
	}
}

weight_edit_with_clear.xml 自定义控件布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@null"
    android:orientation="horizontal" >

    <EditText
        android:id="@+id/et"
        style="@style/text_normal"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:background="@null"
        android:gravity="center_vertical"
        android:maxLength="20"
        android:paddingLeft="5dp"
        android:paddingRight="4dp"
        android:singleLine="true" />

    <ImageButton
        android:id="@+id/clear_ib"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@null"
        android:contentDescription="@string/image_content"
        android:src="@drawable/common_input_box_clear"
        android:visibility="gone" />

</LinearLayout>

这个布局文件就是自定义控件组合的布局文件,我采用线性布局,然后将EditText 和ImageButton 组合起来。

属性配置文件 attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="EditTextWithClearBitton">
        <attr name="text"  format="string"/>
        <attr name="hint"  format="string" />
    </declare-styleable>
</resources>


Activity 布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:wwf="http://schemas.android.com/apk/res/xidian.wwf.temperature"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/white"
    android:orientation="vertical" >


    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/table_above_nor"
        android:gravity="center"
        android:orientation="horizontal"
        android:padding="10dp"
        android:layout_margin="10dp" >

        <TextView
            style="@style/text_normal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_marginLeft="10dp"
            android:singleLine="true"
            android:text="@string/account"
            android:textStyle="bold" />

        <xidian.wwf.temperature.weight.EditTextWithClearButton
            android:id="@+id/ssss"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical" 
            wwf:text="@string/system_error"
            >
        </xidian.wwf.temperature.weight.EditTextWithClearButton>
    </LinearLayout>

</LinearLayout>

引入我们自定义的属性,需在布局文件中加入上面的

xmlns:wwf="http://schemas.android.com/apk/res/项目包名"

在控件初始化中,获得属性值,赋给控件即可,赋值的代码

//将属性值设置到控件中
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.EditTextWithClearBitton);
CharSequence hint = a.getText(R.styleable.EditTextWithClearBitton_hint);
CharSequence text = a.getText(R.styleable.EditTextWithClearBitton_text);
if (text!=null&&!StringUtil.isEmpty(text.toString().trim())) {
	editText.setText(text);
	//设置光标位置
	editText.setSelection(text.length());
	this.clearImageButton.setVisibility(View.VISIBLE);
}else {
	if (hint!=null&&!StringUtil.isEmpty(hint.toString().trim())) {
		editText.setHint(hint);
	}
}
a.recycle();

然后就可以使用这个自定义控件了

下面是我运行的结果


© 著作权归作者所有

上一篇: JFinal 整合Quartz
下一篇: Atlas 安装和配置
超级大富

超级大富

粉丝 49
博文 20
码字总数 26710
作品 1
温州
技术主管
私信 提问
加载中

评论(2)

小克898
小克898
通过控件组合来自定义,可以看下继承来实现下
短短的歼击机
短短的歼击机
不错,希望能和你交流
Android 自定义组合控件小结

引言 接触Android UI开发的这段时间以来,对自定义组合控件有了一定的了解,为此小结一下,本文小结内容主要讨论的是如何使用Android SDK提供的布局和控件组成一个功能完整组合控件并将其封装...

程序袁_绪龙
2014/09/24
313
0
如何自定义LinearLayout

最近通过看别人代码和网上搜索,发现现在自定义LinearLayout的方式有两种。第一种是在扩展的LinearLayout构造函数中使用Inflater加载一个布局,并从中提取出相关的UI组件进行封装,形成一个独...

Kingguary
2012/06/25
5.1K
0
Android自定义控件实现及其布局

Android自定义控件实现及其布局 Android自定义控件一般要继承View类,因此控件的实现及其相应的布局需要完成: 1. 继承View类,并实现参数为(Context context,AttributeSet attrs)的构造函数...

长平狐
2012/10/08
6.1K
0
创建自定义控件属性及三个构造方法详解

今天在创建自定义控件时想看看三个构造方法的区别于是乎引起了下文: 首先做个普及自定义控件和属性的具体流程直接上代码: 首先创建一个自己的类(控件名称) public class myView extends F...

找到组织
2013/11/20
3.6K
1
android 打包自己的自定义组件成JAR包

在项目开发过程中,我们难免会用到自己去制作自定义的VIEW控件,之后我们别的项目如果需要的话就直接将其复制到对应的项目中使用,虽说这么做是一个解决问题的方法,但毕竟不是很好。 原因是...

刘遇安
2013/04/19
283
3

没有更多内容

加载失败,请刷新页面

加载更多

最简单的获取相机拍照的图片

  import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import andr......

MrLins
今天
6
0
说好不哭!数据可视化深度干货,前端开发下一个涨薪点在这里~

随着互联网在各行各业的影响不断深入,数据规模越来越大,各企业也越来越重视数据的价值。作为一家专业的数据智能公司,个推从消息推送服务起家,经过多年的持续耕耘,积累沉淀了海量数据,在...

个推
今天
9
0
第三方支付-返回与回调注意事项

不管是支付宝,微信,还是其它第三方支付,第四方支付,支付机构服务商只要涉及到钱的交易都要进行如下校验,全部成功了才视为成功订单 1.http请求是否成功 2.校验商户号 3.校验订单号及状态...

Shingfi
今天
5
0
简述Java内存分配和回收策略以及Minor GC 和 Major GC(Full GC)

内存分配: 1. 栈区:栈可分为Java虚拟机和本地方法栈 2. 堆区:堆被所有线程共享,在虚拟机启动时创建,是唯一的目的是存放对象实例,是gc的主要区域。通常可分为两个区块年轻代和年老代。更...

DustinChan
今天
7
0
Excel插入批注:可在批注插入文字、形状、图片

1.批注一直显示:审阅选项卡-------->勾选显示批注选项: 2.插入批注快捷键:Shift+F2 组合键 3.在批注中插入图片:鼠标右键点击批注框的小圆点【重点不可以在批注文本框内点击】----->调出批...

东方墨天
今天
7
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部