2012-11-15 6 views
15

私はオートコンプリートテキストビューを提供してユーザに提案を表示しています。ユーザが選択したアイテムに基づいて、アイテムのIDを取得してデータベース側で使用しています。私の問題は、オートコンプリートのテキストビューからのみ選択するようにユーザーを制限することです(つまり、ユーザーは自分のテキストを入力しないでください)。これはクライアントの要件です。これを行う方法?Android:オートコンプリートから選択するようにユーザに制限する

+0

ご質問は明確ではない呼び出すことによって、ドロップダウン、ポップアップから作られたかどうかをチェックする機能を提供します。どちらの選択を制限したいのですか/ユーザーはどこで選択できますか? – stoilkov

+1

あなたはテキストビューを編集するようにユーザーを制限しようとしていますか?彼はオートコンプリート選択項目の中から1つだけを選択できますか? – Drejc

+0

@Drejcはいそれは私が必要としたものです –

答えて

22

ここでは非常に簡単なソリューションです:

あなたがでsetOnItemClickListenerを設定することにより、選択した値を格納する変数を作成することができますAutoCompleteTextViewユーザーがTextWatcherを追加してフィールドに入力するたびに、その値がnullになります。最後に、変数がnullでないことを確認してから続行してください。

String my_var; //keep track! 
AutoCompleteTextView tv = (AutoCompleteTextView) layout.findViewById(R.id.tv); 
tv.setAdapter(my_adapter); 
tv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     my_var = my_adapter.getItem(position).toString(); 
    } 
}); 
/** 
* Unset the var whenever the user types. Validation will 
* then fail. This is how we enforce selecting from the list. 
*/ 
tv.addTextChangedListener(new TextWatcher() { 
    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 
    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     my_var = null; 
    } 
    @Override 
    public void afterTextChanged(Editable s) {} 
}); 
+1

しかし、ユーザがリストに表示される値を入力した場合、 'my_var'はnullにはなりません! – dvrm

+0

@dvrm次に、ユーザーが入力したテキストをアダプターで検索し、各onTextChangedのアダプターから値を選択する必要があります。したがって、ユーザーがactvで 'name'と入力すると、 'n'、 'na'、 'nam'、 'name'を検索し、一致するとその値を選択します。この方法では、テキストが一致する限り、リストの項目はクリックされたかどうかにかかわらず選択されます。 – regretoverflow

+0

マインドの素晴らしいアプリケーションです。ありがとう。 –

1

[OK]私はあなたの入力を提案ボックスにリストされている項目のリストに含まれているテキストに制限したいとします。例えば

あなたが持っている場合:

  • 一つ

は、ユーザーが最初の文字だけ "O" と "T" のために入力することができます。 これまでに入力したテキストに従って。さらに、あなたはおそらく、フィルタリングされたリストを反応させ、更新する テキスト変更リスナーフォーカスリスナーが必要になり

editBox = (TextView) findViewById(R.id.editBox); 
editBox.setFilters(getFilters()); 
editBox.addTextChangedListener(this); 
editBox.setOnFocusChangeListener(this); 

:あなたはのTextViewsetFilters方法を利用することができ、これを達成するために

新しい文字が入力されたときにプラスを押してフィルタを更新します。ここで

は、私がプロジェクトで使用している小数フィルタの例である:

protected InputFilter[] getFilters() 
    { 
     InputFilter[] filters = new InputFilter[1]; 

     filters[0] = new InputFilter() 
     { 
      public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) 
      { 
       // limit input to digits and decimal/thousand separator only 
       // in case thousand separator is pressed, change it to decimal 
       // separator instead 
       String output = ""; 

       if (number.isFocused()) 
       { 
        for (int i = start; i < end; i++) 
        { 
         char c = source.charAt(i); 

         if (isDecimalOrThousandSeparator(c)) 
         { 
          output = output + Character.toString(decimalSeparator); 
         } 
         else if (Character.isDigit(c)) 
         { 
          output = output + Character.toString(c); 
         } 
        } 

        return output == "" ? null : output; 
       } 

       return null; 
      } 
     }; 

     return filters; 
    } 
13

私が取り組んでいるプロジェクトにはこのような要件が必要でしたが、私は必要なものを実装した方法を皆さんに教えてもらいます。

オートコンプリートのテキストビューのフォーカス変更リスナーを追加し、フォーカスがオートコンプリートからフォーカスを変更したときにチェックし、状況を直感的に処理しました。

autoTextViewCountry.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View view, boolean b) { 
      if(!b) { 
       // on focus off 
       String str = autoTextViewCountry.getText().toString(); 

       ListAdapter listAdapter = autoTextViewCountry.getAdapter(); 
       for(int i = 0; i < listAdapter.getCount(); i++) { 
        String temp = listAdapter.getItem(i).toString(); 
        if(str.compareTo(temp) == 0) { 
         return; 
        } 
       } 

       autoTextViewCountry.setText(""); 

      } 
     } 
    }); 

だから私の実装は次のとおりです。入力したテキストは、アレイアダプタに存在しないならば、焦点のテキストビューを空に変更し、後で言うの登録の次のステージに進むときに、このテキストビューかどうかを確認空であるかどうか。

このアプローチが誰かに役立つことを願っています。

ハッピーコーディング。

関連する問題