2015-05-04 2 views
7

Я хотел бы добавить место, когда пользователь выбирает текст из предложений с полным набором предложений, поэтому, когда он продолжает печатать, он начнет с нового слова.Как добавить место в предложение AutoCompleteTextView

Я попытался сделать это, используя TextWatcher, но получаю IndexOutOfBoundsException.

Любые предложения?

enter image description here

текст наблюдающий я использовал:

private class AddSpaceTextWatcher implements TextWatcher{ 

    boolean shouldAddSpace = false; 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int before, int count) { 

    } 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     if (count - before > 1) // check that the new input is not from the keyboard 
      shouldAddSpace = true; 
    } 

    @Override 
    public void afterTextChanged(Editable editable) { 
     if (shouldAddSpace) { 
      shouldAddSpace = false; 
      mAutoCompleteTextView.setText(" "); 
     } 
    } 
} 

Исключение я получаю:

java.lang.IndexOutOfBoundsException: setSpan (18 ... 18) ends beyond length 1 
     at android.text.SpannableStringBuilder.checkRange(SpannableStringBuilder.java:1018) 
     at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:611) 
     at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:607) 
     at android.text.Selection.setSelection(Selection.java:76) 
     at android.text.Selection.setSelection(Selection.java:87) 
     at android.widget.EditText.setSelection(EditText.java:99) 
     at android.widget.SearchView.setQuery(SearchView.java:1465) 
     at android.widget.SearchView.onQueryRefine(SearchView.java:889) 
     at android.widget.SuggestionsAdapter.onClick(SuggestionsAdapter.java:371) 
     at android.view.View.performClick(View.java:4756) 
     at android.view.View$PerformClick.run(View.java:19748) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5254) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693) 
+1

Можете ли вы опубликовать код и стек из исключения? – Blackbelt

+0

возможно, вам нужно позвонить append вместо setText – Blackbelt

+0

можете ли вы разместить свой код блока адаптера. –

ответ

3

Для выбора нескольких элементов, вы можете просто использовать MultiAutoCompleteTextView, который является подклассом AutoCompleteTextView специально созданный для этой цели.

ИЛИ

Если вы просто хотите добавить пробел в конце делает только один пункт, выбираемый, чем попробовать это:

public void afterTextChanged(Editable editable) { 
    String text = editable.toString(); 
    if (shouldAddSpace && text.length() > 0 && !text.endsWith(" ")) { 
     editable.append(' '); 
    } 
} 

Edit:

Когда пространство добавляется, вы можете просто позвонить mAutoCompleteTextView.showDropDown();, чтобы снова открыть раскрывающийся текст с обновленным текстом.

+0

@ Pinhassi это сработало для вас? дайте мне знать, если у вас возникли какие-либо проблемы ... –

+0

Он делает, поэтому я дам вам щедрость, но мне также хотелось бы, чтобы курсор переместился в конец текста (после «»). –

+0

@Pinhassi см. Мой обновленный ответ для обновления курсора, и дайте мне знать, если это не сработает, я не тестировал, но он должен работать! –

0

Я не уверен, если это решит вашу проблему, но mAutoCompleteTextView.setText(" "); удалит текст. Так что я хотел бы сделать это:

mAutoCompleteTextView.setText(mAutoCompleteTextView.getText().toString() + " "); 
0
mAutoCompleteTextView.setText(" "); 

Этот код устанавливает текст текстового вида в «" - то, что вы хотите, - это существующий текст плюс пробел.

mAutoCompleteTextView.setText(mAutoCompleteTextView.getText().append(" ")); 
0

Я предпочитаю использовать «MultiAutoCompleteTextView» для достижения того, что вы пытаетесь сделать.

<AutoCompleteTextView 
    android:id="@+id/autoCompleteTextView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="65dp" 
    android:ems="10" > 

В Java файл:

private AutoCompleteTextView actv; 
actv = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView1); 

Список строк:

String[] countries = getResources(). 
    getStringArray(R.array.list_of_countries); 
    ArrayAdapter adapter = new ArrayAdapter 
    (this,android.R.layout.simple_list_item_1,countries); 
    actv.setAdapter(adapter); 

Этот список показывает пример стран, соответствующих пользовательского ввода. Надеюсь, этот пример поможет вам в работе.

Смежные вопросы