Android 系列 6.17使用Attributes和TextWatcher接口约束EditText值

117 篇文章 4 订阅
6.17使用Attributes和TextWatcher接口约束EditText值
问题
您需要限制用户可以输入的值的范围和类型。

在布局XML中的EditText视图上使用适当的属性,并通过实现TextWatcher接口来增强它们。
讨论
当应用程序需要用户输入时,有时只需要特定类型的值;可能是整数,十进制数,两个值之间的数字或大写的单词。在布局中定义EditText时,可以使用诸如android:inputType之类的属性来约束用户能够键入的内容。这会自动减少以后需要的代码量,因为对输入的数据执行的检查较少。 TextWatcher接口对于限制值也很有用。在以下示例中,EditText仅允许0和100之间的值,例如,表示百分比。没有必要检查值,因为它都是作为用户类型完成。
这里一个简单的布局有一个EditText:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<EditText android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/percent"
android:text="0"
android:maxLength="3"
android:inputType="number"/>
</LinearLayout>

EditText的开始值为零,android:text =“0”,可以输入的字符数限制为三个,android:maxLength =“3”,因为我们需要的最大数字为100,只有有三位数。最后,用户只能使用android:inputType =“number”的正数。
在示例6-24的Activity类中,内部类用于实现TextWatcher接口(Activity本身可用于实现接口)。
afterTextChanged()方法被覆盖,并且当文本随用户类型更改时将被调用。在此方法中,将检查输入的值是否大于100.如果是,则将其设置为100.由于XML属性,无需检查小于零的值,因为它们无法输入。当所有数字被删除时,try catch需要,在这种情况下,大于100的值的测试将导致异常(试图解析一个空字符串)。
TextWatcher还有一个beforeTextChanged()和onTextChanged()方法,您可以覆盖,但在本示例中不使用它们。
实例6-24。 TextWatcher实现
class CheckPercentage implements TextWatcher{
@Override
public void afterTextChanged(Editable s) {
try {
Log.d("Percentage", "input: " + s);
if(Integer.parseInt(s.toString())>100)
s.replace(0, s.length(), "100");
}
catch(NumberFormatException nfe){}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// Not used, details on text just before it changed
// used to track in detail changes made to text, e.g. implement an undo
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// Not used, details on text at the point change made
}
}

最后,在Activity的onCreate()方法中,实现TextWatcher的类使用addTextChangedListener()方法连接到EditText:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
EditText percentage=(EditText) findViewById(R.id.percent);
percentage.addTextChangedListener(new CheckPercentage());
}

注意,在传递afterTextChanged()内部的EditText值时,可以修改它的内部Editable类。但是,不能通过改变传递给beforeTextChanged()和onTextChanged()的CharSequence来改变它。
运行此示例,使用LogCat运行,应显示设置的值,如图6-12所示。
有关EditText支持的属性的更多详细信息,请参阅TextView上的Android文档,从中编辑EditText。


图6-12。 TextWatcher在操作
还要记住,如果更改EditText中的值,它将导致afterTextChanged()方法被再次调用。必须小心确保使用TextWatcher的代码不会导致无限循环。
最好检查Android视图支持的属性,因为在XML布局中定义它们可以减少要编写的代码量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值