2011-03-31 86 views
11

我使用下面的代碼將文本設置爲AutoCompleteTextView字段。但是我注意到,當我將某些文本(並非全部文本,但部分文本)設置爲該文本時,它會自動彈出下拉菜單。如果我不要求重點,那會更好,但更好,並非完全正確。我試過dissmissDropDwon(),它沒有幫助。那麼,在設置文本並關注它之後,是否有任何方法可以阻止下拉顯示?如何禁用AutoCompleteTextView的下拉菜單顯示?

actv.setText("Tim Hortons"); 
actv.setSelection(0, actv.getText().length()); 
actv.requestFocus(); 
actv.dismissDropDown(); // doesn't help 

謝謝!

回答

11

要回答的情況下,一個人自己的問題有同樣的問題:

AutoCompleteTextView的

一個特點是,如果您以編程方式改變它的文本,它會如果滿足以下兩個條件,則下拉選擇列表:1.它具有焦點; 2.該列表超過30個項目。

此行爲實際上,恕我直言,設計缺陷。當程序將文本設置爲AutoCompleteTextView時,這意味着文本已經正確,沒有意義彈出過濾列表供用戶進一步選擇。

actv.setText("Tim Hortons"); 
actv.setSelection(0, actv.getText().length()); 
actv.requestFocus(); 
actv.dismissDropDown(); // doesn't help 

在上面的代碼,requestFocus()方法強制ACTV獲取焦點,這將導致下拉彈出。我嘗試不要求重點,相反,我在設置文本後調用clearFocus()。但行爲非常不自然。 dissmissDropdown()沒有幫助,因爲....我不知道,它只是沒有幫助。所以,經過很多努力之後,我想出了這個解決方法:

  1. 初始化小部件時,我在類字段中記住了適配器。
  2. 更改上面的代碼:

    mAdapter = (ArrayAdapter<String>)actv.getAdapter(); // mAdapter is a class field   
    actv.setText("Tim Hortons"); 
    actv.setSelection(0, actv.getText().length()); 
    actv.setAdapter((ArrayAdapter<String>)null); // turn off the adapter 
    actv.requestFocus(); 
    Handler handler = new Handler() { 
    public void handleMessage(Message msg) { 
        ((AutoCompleteTextView)msg.obj).setAdapter(mAdapter); 
        }; 
    Message msg = mHandler.obtainMessage(); 
    msg.obj = actv; 
    handler.sendMessageDelayed(msg, 200); // turn it back on after 200ms 
    

這裏的技巧是設置ACTV的適配器爲null。因爲沒有適配器,當然系統不會彈出下拉菜單。但該消息將在200ms的編程延遲後將適配器重置回ACTV,並且ACTV將照常正常工作。

這適用於我!

+0

這對我有效;我不需要設置程序化延遲。 – squeeish 2015-09-04 02:46:11

1

嘗試在XML ...

<TextView 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:autoText="false" 
/> 
+0

感謝。它確實讓事情變得更好,彈出下拉菜單的案例更少。但仍不能完全解決問題。但是,謝謝! – wwyt 2011-03-31 04:48:29

10

您也可以啓用/禁用下拉像這樣:

// disable 
actv.setDropDownHeight(0); 
// enable 
actv.setDropDownHeight(LayoutParams.WRAP_CONTENT); 
+0

超級想法!!!! +1 – IronBlossom 2016-05-02 16:28:57

16

你可以嘗試以下步驟:

  1. 當設置文本,也閾值設置爲一個較大價值,以便下拉不會來。

    actv.setThreshold(1000); 
    
  2. 然後重寫OnTouch以將閾值重新設置爲1。

    actv.setOnTouchListener(new OnTouchListener() { 
           @Override 
        public boolean onTouch(View v, MotionEvent event) { 
         actv.setThreshold(1); 
         return false; 
        } 
    }); 
    
+0

這是否阻止搜索實際完成?或者它只是隱藏下拉? – Mauker 2017-10-01 02:09:32

16

另一個解決方案是設置文本之前清除焦點:

mContactTxt.setFocusable(false); 
mContactTxt.setFocusableInTouchMode(false); 
mContactTxt.setText("");    
mContactTxt.setFocusable(true); 
mContactTxt.setFocusableInTouchMode(true); 
1

我也面臨着一個場景,我以這種方式解決。

  1. 以靜態方式(Ex.POJO)存儲要顯示的值。
  2. 檢查存儲的靜態變量是否爲空且不爲空。
  3. 如果其不爲空/不爲空/其長度大於0,則爲該autocompleteTextView設置dismissDropDown()

請找到下面的代碼片段

if(null != testText && testText.length() != 0) { 
    mAutoCompleteSearch.setText(incomingActivity.toString()); 
    mAutoCompleteSearch.dismissDropDown(); //Dismiss the drop down 
    } else { 
    mAutoCompleteSearchDocketActivity.setText(""); 
      // Here it(drop down) will be shown automatically 
    } 

希望,這將幫助別人,乾杯!

0

dismissDropDown()在適配器效果很好:

 SimpleCursorAdapter autoCompleteAdapter = new SimpleCursorAdapter(this, 
        android.R.layout.select_dialog_item, null, 
        new String[] { ContactsContract.Contacts.DISPLAY_NAME }, 
        new int[] { android.R.id.text1 }, 0); 
     mSearchView.setAdapter(autoCompleteAdapter); 
     autoCompleteAdapter.setFilterQueryProvider(new FilterQueryProvider() { 
      @Override 
      public Cursor runQuery(CharSequence constraint) { 
       mSearchView.dismissDropDown(); 
       // return your query code 
      } 
     }); 

希望這會有所幫助。

2

wwyt,我只是重複使用你的訣竅,刪除適配器,這些都是最基本的要點,以忽略/關閉下拉菜單。

AutoCompleteTextView tvSuburbs; 
ArrayAdapter<Suburb> a = (ArrayAdapter<Suburb>) tvSuburbs.getAdapter(); 
tvSuburbs.setAdapter(null); // Remove the adapter so we don't get a dropdown 
tvSuburbs.setText(s.name); // when text is set programmatically. 
tvSuburbs.setAdapter(a); // Restore adapter 
0

我已經解決了同樣的問題與此代碼:

contacts_search.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
       // TODO Auto-generated method stub 
       contacts_search.dismissDropDown();  
      } 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, 
        int after) { 
       // TODO Auto-generated method stub 
       contacts_search.dismissDropDown(); 
      } 

      @Override 
      public void afterTextChanged(Editable s) { 
       // TODO Auto-generated method stub 
       contacts_search.dismissDropDown(); 
      } 
     }); 

這裏,contacts_search是我AutoCompleteTextView

3

滑稽把戲。工程100%:)

tv.setThreshold(Integer.MAX_VALUE); 
tv.setText(station.getName()); 
tv.setThreshold(1); 
+0

確實很有趣,但是達到了目的。 – 2016-09-30 15:18:33

3
act.post(new Runnable() 
{ 
    @Override 
    public void run() 
    { 
    act.dismissDropDown(); 
    } 
}); 

作品就好了!

1

您可以嘗試

searchInput.setAdapter((ArrayAdapter<String>) null); 
searchInput.setText(text); 
searchInput.setAdapter(adapter); 

Source

4

也許是晚了,但我發現這個問題優雅的解決方案:

禁用過濾設置文本後啓用它(而不是玩焦點或/和延遲)。在這種情況下,您應該使用自定義控件。

見下面的例子:

public class CustomCompliteTextView extends AutoCompleteTextView { 

    private boolean mIsSearchEnabled = true; 

    public CustomCompliteTextView(Context context) { 
     super(context); 
    } 

    public CustomCompliteTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public CustomCompliteTextView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public void setSearchEnabled(boolean isEnabled) { 
     mIsSearchEnabled = isEnabled; 
    } 

    @Override 
    protected void performFiltering(CharSequence text, int keyCode) { 
     if (mIsSearchEnabled) { 
      super.performFiltering(text, keyCode); 
     } 
    } 
} 

與用法:

text.setSearchEnabled(false); 
    text.setText("Text you want to set"); 
    // optional, if you also want to set correct selection 
    text.setSelection(text.getText().length()); 
    text.setSearchEnabled(true); 
+1

非常好的+1 – 2016-08-12 12:37:21

0

我需要添加一些延遲做這件事情的工作。

這爲我工作:

new Handler().postDelayed(new Runnable() { 
    public void run() { 
     if(carModel.isPopupShowing()) 
      carModel.dismissDropDown(); 
}}, 500); 
0

這裏的目的是爲了隱藏與AutoCompleteTextView下拉。在佈局文件中將dropDownHeight設置爲零。

<!--Skipping all other attributes for simplicity--> 
<AutoCompleteTextView 
     android:id="@+id/address_bar" 
     android:dropDownHeight="0dp" 
     /> 

對我而言,我有GridView,並且在該視圖上方有一個地址欄。我想根據AutoCompleteTextView中的用戶輸入過濾GridView中的項目,而不需要TextView向我顯示下拉列表。

1
setText("someText",false) 

false意味着它未過濾