短信的RecipientsEditor是比较重要的控件,继承自MultiAutoCompleteTextView,因此有必要先对MultiAutoCompleteTextView作说明。
1.MultiAutoCompleteTextView
继承自AutoCompleteTextView,在自动补全的TextView的基础上,可以实现多个AutoCompleteTextView的叠加,即输入一次完成后,添加一个分隔符(Tokenizer)之后,可以继续输入,同时控件会根据Adapter给出suggestion,方便用户自动完成输入。这种控件非常适合于多次输入的场景,比如收件人。
要实现一个MultiAutoCompleteTextView,首先要提供一个Adapter,用于匹配并提示;另外,必须提供一个
MultiAutoCompleteTextView.Tokenizer
sample1:
- public class CountriesActivity extends Activity {
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.autocomplete_7);
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
- android.R.layout.simple_dropdown_item_1line, COUNTRIES);
- MultiAutoCompleteTextView textView = (MultiAutoCompleteTextView) findViewById(R.id.edit);
- textView.setAdapter(adapter);
- textView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
- }
- private static final String[] COUNTRIES = new String[] {
- "Belgium", "France", "Italy", "Germany", "Spain"
- };
- }
2.RecipientsEditorTokenizer
假如输入的收件人为 Theo,Thelma
f
indTokenStart(
CharSequence text,
int
cursor
):返回选择的收件人的起始位置,比如长按"Thelma",此时光标指向字母e,则此时返回值为5(逗号之后的非空格值的位置)
同理,
findTokenEnd
(CharSequence text,
int
cursor),返回的是选择的收件人的末尾位置。
terminateToken(CharSequence text): 消除","之后的空格返回;如果text没有逗号,则构造text+","+空格返回。
这个方法,涉及一个知识点-SpanableString. 用于特别处理textview中的个别字符,比如有些粗体,有些红色,有些是超链接blabla...
sample2:
- TextView textView = (TextView) findViewById(R.id. test );
- SpannableString sp = new SpannableString("diddle,diddle" );
- sp.setSpan( new URLSpan("http://www.youtube.com" ), 0, 6, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE );
- sp.setSpan( new BackgroundColorSpan(Color. RED), 7, 13, Spannable.SPAN_EXCLUSIVE_INCLUSIVE );
- textView.setText(sp);
terminateToken方法判断TextView是否含有特殊格式的字符,如果有,将该Spanned拷贝至SpannableString中,添加"," + " "
getNumbers(): //TODO 下次补上
转载于:https://blog.51cto.com/rookie1000/1194425