AndroidGUI02:EditText的常用技巧
1. 设定EditText的滚动条、对齐方式、行数、和提示(hint)及其颜色
在布局文件,比如main.xml中,增加
<EditText
android:id="@+id/EditText01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="type something here...请输入..." // 输入提示
android:textColorHint="#FF00FF"// 提示文字的颜色
android:lines="4"// 行数
android:gravity="top"// 上对齐
android:scrollbars="vertical"// 垂直滚动条
/>
在Activity对应的Java文件中,指定包含上述代码的Layout(即main.xml):
setContentView(R.layout.main);
得到的结果如下:
2. 设定EditText中的文字大小、文字颜色和EditText的背景颜色
在布局文件中,增加类似如下代码:
<EditText
android:id="@+id/EditText02"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="50sp"
android:textColor="#FF0000"
android:background="#007F00"
/>
得到的结果如下:
3. 输入过滤器的使用(Input Filter)
输入过滤器,可以用来规范在EditText中输入的内容。比如:
EditText txt02 = (EditText)findViewById(R.id.EditText02);
txt02.setFilters(new InputFilter[]
{
new InputFilter.AllCaps(),
new InputFilter.LengthFilter(2)
});
则txt02这个EditText最多接收2个字符(或者中文字),并且会自动转换为大写。
程序员可以自己定义InputFilter,类似的代码如下(必须重写InputFilter接口中定义的filter方法):
class CustomizedInputFilter implements InputFilter
{
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend)
{
// Log.e("debug", (String)source);
// return (new String((String)source).toUpperCase());
// 下面是InputFilter.AllCaps()的源代码
for (int i = start; i < end; i++)
{
if (Character.isLowerCase(source.charAt(i)))
{
char[] v = new char[end - start];
TextUtils.getChars(source, start, end, v, 0);
String s = new String(v).toUpperCase();
if (source instanceof Spanned)
{
SpannableString sp = new SpannableString(s);
TextUtils.copySpansFrom((Spanned) source, start, end, null, sp, 0);
return sp;
}
else
{
return s;
}
}
}
return null; // keep original
}
}
4. 指定EditText为密码输入框和设定EditText激活状态
<EditText
android:id="@+id/EditText03"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:password="true"// 密码输入框,会屏蔽输入的字符
/>
<EditText
android:id="@+id/EditText04"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:enabled="false" // 设定活动状态为false,既不能编辑,也不能
/>// focusable
具体效果就不演示了。
5. AutoCompleteTextView的使用
AutoCompleteTextView可以被认为是一种特殊的EditText,用户在AutoCompleteTextView中输入部分字符,就会得到和该输入字符匹配的列表,该列表由开发人员事先提供,用户只需要选择其中之一即可,这样可以节省用户输入的字符数,同时也可以减少出错的机会。比如,在布局文件main.xml中,有如下代码:
<AutoCompleteTextView
android:id="@+id/AutoCompleteTextView01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:completionHint="Pick a country or type your own"// 下拉列表的提示
android:dropDownHeight="120px"// 下拉列表的高度
android:completionThreshold="1"// 键入多少字符,即可出现下拉列表
/>
在Activity对应的java文件中:
public class ControlEditText extends Activity
{
// 定义一个字符串数组
final String[] COUNTRIES = {"China", "Cuba", "Costa Rica",
"Columbia", "Canada", "America",
"Africa", "Belgium", "India"};
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 构建一个ArrayAdapter对象
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_dropdown_item_1line,
COUNTRIES);
// 获取AutoCompleteTextView对象text
AutoCompleteTextView text = (AutoCompleteTextView)findViewById(R.id.AutoCompleteTextView01);
// 给text指定ArrayAdapter对象
text.setAdapter(adapter);
}
}
其中用到的ArrayAdapter构造方法说明如下:
public ArrayAdapter (Context context, int textViewResourceId, T[] objects)
Parameters
context | The current context. |
textViewResourceId | The resource ID for a layout file containing a TextView to use when instantiating views. |
在android.R.layout包下,定义了许多诸如simple_dropdown_item_1line这样的TextView资源ID | |
objects | The objects to represent in the ListView. |
运行代码,得到的结果如下:
输入一个字符c,则adapter中所有以c(缺省地,不区分大小写)大头的国家,会全部显示在下拉列表中,用户仅需要做一个简单的选择就可以了。如果android:completionThreshold的属性为"2",那么用户需要输入两个字符,下拉列表才会出现。
选择输入完成后,用户可以继续在上面的EditText中继续输入。
6. MultiAutoCompleteTextView的使用
MultiAutoCompleteTextView也可以被认为是一种特殊的EditText,它的作用基本上和AutoCompleteTextView一样:用户在MultiAutoCompleteTextView中输入部分字符,就会得到和该输入字符匹配的列表,该列表由开发人员事先提供,用户只需要选择其中之一即可,这样可以节省用户输入的字符数,同时也可以减少出错的机会。
它和AutoCompleteTextView唯一不同的地方就是:AutoCompleteTextView只有第一个输入的单词可以auto complete,而MultiAutoCompleteTextView,则可以多次进行auto complete。在使用MultiAutoCompleteTextView的时候,要提供tokenizer,tokenizer用于分隔单词。比如,在布局文件main.xml中,有如下代码:
<MultiAutoCompleteTextView
android:id="@+id/MultiAutoCompleteTextView01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:completionHint="Pick a country or type your own"
android:dropDownHeight="120px"
android:completionThreshold="1"
/>
在Activity对应的java文件中:
public class ControlEditText extends Activity
{
final String[] COUNTRIES = {"China", "Cuba", "Costa Rica",
"Columbia", "Chizen", "Canada", "America",
"Africa", "Belgium", "India"};
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_dropdown_item_1line,
COUNTRIES);
AutoCompleteTextView text = (AutoCompleteTextView)findViewById(R.id.AutoCompleteTextView01);
text.setAdapter(adapter);
// 获取MultiAutoCompleteTextView对象text
MultiAutoCompleteTextView mtext =
(MultiAutoCompleteTextView)findViewById(R.id.MultiAutoCompleteTextView01);
// 依然使用前面构造好的ArrayAdapter对象
mtext.setAdapter(adapter);
// 指定分隔符”,”
mtext.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
}
}
结果如下:
我们可以看到,输入c,然后可以在下拉列表中选择China,会自动增加一个分隔符。此时,输入a,则会把和a匹配的America以及Africa显示在下拉列表中。
如果我们把COUNTRIES数组中的内容改为中文:
final String[] COUNTRIES = {"印度", "印度尼西亚", "新加坡",
"新赤道几内亚", "巴基斯坦", "南非", "南斯拉夫",
"北非", "北爱尔兰", "巴勒斯坦"};
可以看到,AutoCompleteTextView和MultiAutoCompleteTextView都支持中文: