Android 中自定义控件之判断还剩多少可输入字符的EditText

最近做的项目有个需求就是判断一下还 剩多少字符可输入,也就是对EditText 的文本变化做监听 ,功能实现了,但是感觉使用组合方式,每次都要编写,还不如写一个自定义控件来备用。在查看本文时,建议先行参考本人转载的一篇文章:http://blog.csdn.net/android_jiangjun/article/details/39580253

下面进入本文的正题:

首先大家先看一下效果图吧:

本文自定义的控件采用的是组合控件的方式来自定义控件,自定义控件的布局如下

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#fff"

    >

<EditText
    android:id="@+id/edit"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="top|left"
    android:minLines="5"

    />
<TextView
    android:id="@+id/text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:hint="还可输入25字"
    android:textSize="10dip"
    android:layout_alignBottom="@id/edit"
    android:layout_alignRight="@id/edit"
    android:layout_marginRight="3dip"
    android:layout_marginBottom="3dip"
    />
</RelativeLayout>

然后相应的自定义HintEdit类代码如下:

package com.gc.testcustomedittext;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.text.Editable;
import android.text.InputFilter;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
/**
 *
 * @author Android将军
 *
 */
public class HintEditText extends RelativeLayout implements TextWatcher{

	private EditText mEditText;
	private TextView mTextView;
	private int maxLength=0;
	private RelativeLayout mRelativeLayout;
	@SuppressLint("NewApi") public HintEditText(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);

	}
	public HintEditText(Context context) {
		super(context);

	}
	public HintEditText(Context context, AttributeSet attrs) {
		super(context, attrs);
		TypedArray mTypedArray=context.obtainStyledAttributes(attrs, R.styleable.HintEditText);
		maxLength=mTypedArray.getInt(R.styleable.HintEditText_maxLength, 0);
		mRelativeLayout=(RelativeLayout)LayoutInflater.from(context).inflate(R.layout.custom_edittext, this,true);
		mEditText=(EditText)mRelativeLayout.findViewById(R.id.edit);
		mTextView=(TextView)mRelativeLayout.findViewById(R.id.text);
		mTextView.setHint("还可输入"+maxLength+"字");
		//限定最多可输入多少字符
		mEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(maxLength)});
		mEditText.addTextChangedListener(this);

	}
	public void initUI(Context context)
	{

		RelativeLayout mRelativeLayout=(RelativeLayout)LayoutInflater.from(context).inflate(R.layout.custom_edittext, this,true);

		mEditText=(EditText)mRelativeLayout.findViewById(R.id.edit);

		 mTextView=(TextView)mRelativeLayout.findViewById(R.id.text);

	}

	@Override
	public void beforeTextChanged(CharSequence s, int start, int count,
			int after) {
		// TODO Auto-generated method stub

	}
	@Override
	public void onTextChanged(CharSequence s, int start, int before, int count) {
		// TODO Auto-generated method stub
		mTextView.setHint("还可输入"+(maxLength-s.toString().length())+"字");

	}
	@Override
	public void afterTextChanged(Editable s) {
		// TODO Auto-generated method stub

	}

}

attrs.xml文件的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="HintEditText">
        <attr name="maxLength" format="integer"/>
   <!--maxLength为自定义控件的属性,这样自定义属性之后,可以在xml文件中直接设置该属性-->
 </declare-styleable>
</resources>

主布局的文件代码如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:HintEditText="http://schemas.android.com/apk/res/com.gc.testcustomedittext"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <com.gc.testcustomedittext.HintEditText
        android:id="@+id/hint_edt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        HintEditText:maxLength="30"
        />

    <com.gc.testcustomedittext.HintEditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
         HintEditText:maxLength="50"
       />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="sahjdsahjd " />

</LinearLayout>

MainActivity的代码如下:

package com.gc.testcustomedittext;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
/**
 *
 * @author Android将军
 *
 */
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }
}

本定义控件可以直接拿来使用,只需要把自定义控件的布局文件和HintEditText类拷贝到你的工程目录里即可使用,像主布局和MainActivity那样使用即可。

转载请注明出处:http://blog.csdn.net/android_jiangjun/article/details/39580715

时间: 2024-12-06 14:03:46

Android 中自定义控件之判断还剩多少可输入字符的EditText的相关文章

《转载-两篇很好的文章整合》Android中自定义控件

两篇很好的文章,有相互借鉴的地方,整合到一起收藏 分别转载自:http://blog.csdn.net/xu_fu/article/details/7829721 http://www.cnblogs.com/0616--ataozhijia/p/4003380.html Android系统的视图结构的设计也采用了组合模式,即View作为所有图形的基类,Viewgroup对View继承扩展为视图容器类,由此就得到了视图部分的基本结构--树形结构 View定义了绘图的基本操作 基本操作由三个函数完

【转】Android中自定义控件的步骤

原文网址:http://blog.csdn.net/lianchen/article/details/48038969 Android开发中难免遇到需要自定义控件的需求,有些是产品的要求在Android标准控件库中没有满足要求的,有些是开发过程中没有代码的可复用,自己定义的. 一个好的自定义控件应当和Android本身提供的控件一样,封装了一系列的功能以供开发者使用,不仅具有完备的功能,也需要高效的使用内存和CPU.Android本身提供了一些指标:1. 应当遵守Android标准的规范(命名,

Android中自定义控件的步骤

Android开发中难免遇到需要自定义控件的需求,有些是产品的要求在Android标准控件库中没有满足要求的,有些是开发过程中没有代码的可复用,自己定义的. 一个好的自定义控件应当和Android本身提供的控件一样,封装了一系列的功能以供开发者使用,不仅具有完备的功能,也需要高效的使用内存和CPU.Android本身提供了 一些指标: 1. 应当遵守Android标准的规范(命名,可配置,事件处理等). 2. 在XML布局中科配置控件的属性. 3. 对交互应当有合适的反馈,比如按下,点击等. 4

Android 中自定义控件和属性(attr.xml,declare-styleable,TypedArray)的方法和使用

本文转载自http://blog.csdn.net/jincf2011/article/details/6344678 今天我们的教程是根据前面一节扩展进行的,如果你没有看,请点击 Android高手进阶教程(三)查看第三课,这样跟容易方便你的理解! 在xml 文件里定义控件的属性,我们已经习惯了android:attrs="" ,那么我们能不能定义自己的属性能,比如:test:attrs="" 呢?答案是肯定的. 进入主题.大致以下步骤: 一. 在res/valu

Android中自定义组合控件

Android中自定义控件的情况非常多,一般自定义控件可以分为两种:继承控件及组合控件.前者是通过继承View或其子类,重写方法实现自定义的显示及事件处理方式:后者是通过组合已有的控件,来实现结构的简化和代码的重用. 本篇文章主要介绍自定义组合控件,继承控件后续有机会再述. 自定义组合控件一般来说都是以ViewGroup及其子类(LinearLayout.RelativeLayout.FrameLayout等)为主,内部嵌套其他控件,来组合成一个新的控件,实现一些特定的需要,可以是代码简化,结构

android中如何判断edittext中数据为空?

??今天写了一个简单的记忆便笺小程序,但是却发现在判断添加数据不能为空的时候,自己的代码总是不起作用. String titleStr = addtitle.getText().toString(); String contentStr = addcontent.getText().toString(); if (titleStr == null && contentStr == null) { Toast.makeText(this, "不能添加一个空数据", Toa

android中根据touch事件判断单击及双击

private static final int MAX_INTERVAL_FOR_CLICK = 250;     private static final int MAX_DISTANCE_FOR_CLICK = 100;     private static final int MAX_DOUBLE_CLICK_INTERVAL = 500;     int mDownX = 0;     int mDownY = 0;     int mTempX = 0;     int mTempY

Android中判断网络连接是否可用及监控网络状态

Android中判断网络连接是否可用及监控网络状态 作者: 字体:[增加 减小] 类型:转载 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限,接下来详细介绍Android中判断网络连接是否可用及监控网络状态,感兴趣的朋友可以参考下 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"

十九、android中判断sim卡状态和读取联系人资料的方法

在写程序中,有时候可能需要获取sim卡中的一些联系人资料.在获取sim卡联系人前,我们一般会先判断sim卡状态,找到sim卡后再获取它的资料,如下代码我们可以读取sim卡中的联系人的一些信息. PhoneTest.java package com.android.test; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.datab