首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于MultiAutoCompleteTextView

关于MultiAutoCompleteTextView
EN

Stack Overflow用户
提问于 2010-12-08 21:57:43
回答 1查看 2.2K关注 0票数 0
代码语言:javascript
复制
 public class testMultiAutoCompleteTextView extends ListActivity  {
/** Called when the activity is first created. */
private MultiAutoCompleteTextView searchEdit;
 Button   okButton;
private ArrayAdapter<String> adapter = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, mStrings);

   setListAdapter(adapter);

    searchEdit = (MultiAutoCompleteTextView) findViewById(R.id.search_box);

    searchEdit.addTextChangedListener(filterTextWatcher);

    searchEdit.setTokenizer(new SpaceTokenizer());

    searchEdit.setAdapter(adapter);

    searchEdit.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            String t = ((TextView) v).getText().toString();
            String f = searchEdit.getText().toString();

            int s = searchEdit.getSelectionStart();
            int i = s;

            while (i > 0 && f.charAt(i - 1) != ' ') {
                i--;
            }

            adapter.getFilter().filter(t.substring(i, s));
        }
    });

    okButton = (Button) findViewById(R.id.ok);
    okButton.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            Bundle stats = new Bundle();
            stats.putString("ConversationName", searchEdit.getText()
                    .toString());

            Intent i = new Intent();
            i.putExtras(stats);
            setResult(RESULT_OK, i);
            finish();
        }
    });

    searchEdit.setOnKeyListener(new OnKeyListener() {

        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT
                    || keyCode == KeyEvent.KEYCODE_DPAD_RIGHT
                    || keyCode == KeyEvent.KEYCODE_DPAD_UP
                    || keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {

                String t = ((TextView) v).getText().toString();
                String f = searchEdit.getText().toString();

                int s = searchEdit.getSelectionStart();
                int i = s;

                while (i > 0 && f.charAt(i - 1) != ' ') {
                    i--;
                }

                adapter.getFilter().filter(t.substring(i, s));

                return false;
            }

            return false;
        }
    });

    getListView().setOnItemClickListener(
            new ListView.OnItemClickListener() {
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {

                    String t = adapter.getItem(position);
                    String f = searchEdit.getText().toString();

                    int s = searchEdit.getSelectionStart();
                    int i = s;

                    while (i > 0 && f.charAt(i - 1) != ' ') {
                        i--;
                    }

                    searchEdit.getText().insert(s, t.substring(s - i));
                }
            });
}


    @Override
protected void onDestroy() {
    super.onDestroy();
    searchEdit.removeTextChangedListener(filterTextWatcher);
}


private TextWatcher filterTextWatcher = new TextWatcher() {

    public void afterTextChanged(Editable s) {
        okButton.setEnabled(searchEdit.getText().toString().trim()
                .length() > 0);
    }

    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
    }

    public void onTextChanged(CharSequence s, int start, int before,
            int count) {
        adapter.getFilter().filter(s);
    }

};



public class SpaceTokenizer implements Tokenizer {

public int findTokenStart(CharSequence text, int cursor) {
    int i = cursor;

    while (i > 0 && text.charAt(i - 1) != ' ') {
        i--;
    }
    while (i < cursor && text.charAt(i) == ' ') {
        i++;
    }

    return i;
}

public int findTokenEnd(CharSequence text, int cursor) {
    int i = cursor;
    int len = text.length();

    while (i < len) {
        if (text.charAt(i) == ' ') {
            return i;
        } else {
            i++;
        }
    }

    return len;
}

public CharSequence terminateToken(CharSequence text) {
    int i = text.length();

    while (i > 0 && text.charAt(i - 1) == ' ') {
        i--;
    }

    if (i > 0 && text.charAt(i - 1) == ' ') {
        return text;
    } else {
        if (text instanceof Spanned) {
            SpannableString sp = new SpannableString(text + " ");
            TextUtils.copySpansFrom((Spanned) text, 0, text.length(),
                    Object.class, sp, 0);
            return sp;
        } else {
            return text + " ";
        }
    }
}
}
 private String[] mStrings = {

            "Vacherin-Fribourgeois", "Valencay", "Vasterbottenost", "Venaco", "Vendomois",
            "Vieux Corse", "Vignotte", "Vulscombe", "Waimata Farmhouse Blue",
            "Washed Rind Cheese (Australian)", "Waterloo", "Weichkaese", "Wellington",
            "Wensleydale", "White Stilton", "Whitestone Farmhouse", "Wigmore", "Woodside Cabecou",
            "Xanadu", "Xynotyro", "Yarg Cornish", "Yarra Valley Pyramid", "Yorkshire Blue",
            "Zamorano", "Zanetti Grana Padano", "Zanetti Parmigiano Reggiano"};

}我的xml:

代码语言:javascript
复制
   <?xml version="1.0" encoding="utf-8"?>
   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="fill_parent" android:layout_height="fill_parent"
       android:orientation="vertical"
       android:drawingCacheQuality="high">

   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="fill_parent" android:layout_height="wrap_content"
       android:orientation="horizontal">


<MultiAutoCompleteTextView
    android:layout_marginLeft="1dip"
    android:layout_marginTop="1dip"
    android:layout_height="wrap_content" 
    android:layout_weight="1"
    android:layout_width="fill_parent"
    android:dropDownHeight="0px" 
    android:hint="@string/To" 
    android:id="@+id/search_box"
    ></MultiAutoCompleteTextView>



<Button android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:text="Ok"
    android:id="@+id/ok"
    android:enabled="false"
    />  


  </LinearLayout>     
  <ListView android:id="@android:id/list" android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:layout_weight="1" />

    </LinearLayout>

它给我错误/AndroidRuntime(423):java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.testMultiAutoCompleteTextView/com.test.testMultiAutoCompleteTextView.testMultiAutoCompleteTextView}:java.lang.NullPointerException

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-11 12:15:28

在调用onCreate方法之前

代码语言:javascript
复制
adapter = new ArrayAdapter<String>(this,
        android.R.layout.simple_list_item_1, mStrings);

你必须设置你的布局

代码语言:javascript
复制
setContentView(R.layout.you_xml_file_name);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4388286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档