短信的RecipientsEditor是比较重要的控件,继承自MultiAutoCompleteTextView,因此有必要先对MultiAutoCompleteTextView作说明。

   1.MultiAutoCompleteTextView

   继承自AutoCompleteTextView,在自动补全的TextView的基础上,可以实现多个AutoCompleteTextView的叠加,即输入一次完成后,添加一个分隔符(Tokenizer)之后,可以继续输入,同时控件会根据Adapter给出suggestion,方便用户自动完成输入。这种控件非常适合于多次输入的场景,比如收件人。
    要实现一个MultiAutoCompleteTextView,首先要提供一个Adapter,用于匹配并提示;另外,必须提供一个 MultiAutoCompleteTextView.Tokenizer
    sample1:

 
   
  1. public class CountriesActivity extends Activity { 
  2.      protected void onCreate(Bundle savedInstanceState) { 

 
  
  1.  
  2.          super.onCreate(savedInstanceState); 
  3.          setContentView(R.layout.autocomplete_7); 
  4.  
  5.          ArrayAdapter<String> adapter = new ArrayAdapter<String>(this
  6.                  android.R.layout.simple_dropdown_item_1line, COUNTRIES); 
  7.          MultiAutoCompleteTextView textView = (MultiAutoCompleteTextView) findViewById(R.id.edit); 
  8.          textView.setAdapter(adapter); 
  9.          textView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer()); 
  10.      } 
  11.  
  12.      private static final String[] COUNTRIES = new String[] { 
  13.          "Belgium", "France", "Italy", "Germany", "Spain" 
  14.      }; 
  15. }

  

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:
 
  
  1. TextView textView = (TextView) findViewById(R.id. test ); 
  2.         SpannableString sp = new SpannableString("diddle,diddle" ); 
  3.         sp.setSpan( new URLSpan("http://www.youtube.com" ), 0, 6, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ); 
  4.         sp.setSpan( new BackgroundColorSpan(Color. RED), 7, 13, Spannable.SPAN_EXCLUSIVE_INCLUSIVE ); 
  5.         textView.setText(sp); 

效果如下 

device-2013-05-07-000244_副本   

 terminateToken方法判断TextView是否含有特殊格式的字符,如果有,将该Spanned拷贝至SpannableString中,添加"," + " "


getNumbers(): //TODO 下次补上