EditText类是TextView类的子类,也就是View类的一个子类,所以,View类的属性和方法EditText类全部继承了下来。
这个控件的主要目的是与用户进行交互,让用户可以输入自己想要输入的文本或者是图片。
以下举例一个应用,该应用的目的是利用EditText控件的属性以及其函数来限制控件输入的类型。
res/layout下的activity_main.xml中的内容改为如下:
<?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" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/text01"
android:textSize="20sp" />
<EditText
android:id="@+id/editText01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/edit_text01_hint"
android:digits="@string/charsordigits" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/text02"
android:textSize="20sp" />
<EditText
android:id="@+id/editText02"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/edit_text02_hint" />
</LinearLayout>
res/values下的strings.xml中的内容改为:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">myEditText</string>
<string name="action_settings">Settings</string>
<string name="text01">只允许输入英文字符和数字,最大长度为10</string>
<string name="edit_text01_hint">0123456789</string>
<string name="text02">只允许输入上面输入框中字符,无长度限制</string>
<string name="edit_text02_hint">输入字符试试</string>
<string name="charsordigits">
0123456789abcdefghijklmnopqrstuvwxyz
</string>
</resources>
Java源代码文件中的代码改为:
package com.example.myedittext;
import android.os.Bundle;
import android.app.Activity;
import android.text.Editable;
import android.text.InputFilter;
import android.text.TextWatcher;
import android.view.Menu;
import android.widget.EditText;
//程序的主类
public class MainActivity extends Activity {
private EditText editText01;
private EditText editText02;
private MyTextWatcher myTextWatcher;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//EditText空间变量与XML布局中的元素绑定
editText01 = (EditText)findViewById(R.id.editText01);
editText02 = (EditText)findViewById(R.id.editText02);
//定义一个输入滤波器,在代码中限制editText01最大长度为10
InputFilter[] ifs = {new InputFilter.LengthFilter(10)};
editText01.setFilters(ifs);
//设置显示内容
editText01.setText("");
//为控件editText02定义一个文字改变监听器
myTextWatcher = new MyTextWatcher(editText02, "");
//为控件editText02添加文字改变监听器
editText02.addTextChangedListener(myTextWatcher);
//为控件editText01定义一个文字改变监听器
editText01.addTextChangedListener(new TextWatcher(){
// @Override
public void onTextChanged(CharSequence s, int start, int before, int count){
// Do nothing
}
public void beforeTextChanged(CharSequence s, int start, int count, int after){
// Do nothing
}
public void afterTextChanged(Editable s){
//去掉之前editText02的监听
editText02.removeTextChangedListener(myTextWatcher);
//用editText01中的字符串新建监听
myTextWatcher = new MyTextWatcher(editText02, s.toString());
//重新添加监听
editText02.addTextChangedListener(myTextWatcher);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
// 监听文本控件文字改变的类
class MyTextWatcher implements TextWatcher{
//暂时存放上面一个控件的输入的值
private String tmp = "";
//可以输入的字符
private String digits = "abcdef";
private EditText editText;
//构造函数
public MyTextWatcher(final EditText editText, final String digits){
this.editText = editText;
this.digits = digits;
}
public void onTextChanged(CharSequence s, int start, int before, int count){
}
public void beforeTextChanged(CharSequence s, int start, int count, int after){
//获得改变前的字符串
tmp = s.toString();
}
public void afterTextChanged(Editable s){
//如果tmp = str则返回,因为这是我们设置的结果,否则会形成死循环
String str = s.toString();
if(str.equals(tmp)){
return;
}
StringBuffer sb = new StringBuffer();
for(int i = 0; i < str.length(); ++i){
//判断字符是否在可以输入的字符串中
if(digits.indexOf(str.charAt(i)) >= 0){
//如果是,就添加到结果里,否则跳过
sb.append(str.charAt(i));
}
}
//设置tmp, 因为下面一句还会导致该事件被触发
tmp = sb.toString();
//设置结果
editText.setText(tmp);
//更新控件内容
editText.invalidate();
}
}