2012-11-15 21 views
15

我已經提供了一個自動完成的文本視圖來向用戶顯示建議。基於用戶選擇的項目,我得到項目的ID並在數據庫側使用它。現在我的問題是限制用戶僅從自動完成textview中進行選擇(即用戶不應輸入他自己的文本)。這是客戶的要求。這個怎麼做?Android:限制用戶只從自動完成文本視圖中選擇

+0

你的問題選擇是否從下拉彈出製作的能力,目前尚不清楚。你想限制哪個選擇/用戶可以在哪裏做出選擇? – stoilkov

+1

你是否試圖限制用戶編輯textView ...所以他只能選擇自動完成選項中的一個項目? – Drejc

+0

@Drejc是的,這就是我需要的 –

回答

22

這裏是一個非常簡單的解決方案:

您可以創建一個變量,通過設置setOnItemClickListener存儲選定值您的AutoCompleteTextView。然後你可以null,只要用戶在該字段中輸入TextWatcher即可。最後,你可以在繼續之前驗證你的變量是否爲空。

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不應該爲空! – dvrm

+0

@dvrm然後您需要在適配器中搜索用戶輸入的文本,然後從每個onTextChanged上的適配器中選擇值。因此,假設用戶在actv中輸入'name',然後搜索'n','na','nam','name',當您找到匹配項時,請選擇該值。這樣,無論他們是否點擊它,列表中的項目都會被選中,只要文字符合 – regretoverflow

+0

的精彩應用。謝謝。 –

1

好吧我假設你想限制用戶對建議框中列出的項目列表中包含的文本的輸入。

例如,如果您有:

  • 一個
  • 兩個

那麼用戶只能鍵入的第一個字符 「O」 和 「T」。 依據之前輸入的文字等。

要做到這一點,你可以利用setFilters方法TextView的

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

另外,你可能會需要文本變化監聽焦點監聽反應和更新過濾列表當輸入一個新字符...加上更新過濾器。

下面是我在一個項目中使用的十進制數字濾波器的例子:

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(""); 

      } 
     } 
    }); 

所以我的實現是:如果輸入的文本不會在陣列適配器繼續說登記的下一個階段,當上存在然後重點變成空的文本視圖,後來,檢查這個文本視圖是空的還是不空的。

希望這種方法可以幫助某人。

快樂編碼。

相關問題