2012-05-07 64 views
13

我在android應用程序中創建了一個搜索選項。在沒有輸入任何內容時禁用鍵盤的發送按鈕[Android]

屏幕鍵盤上按下「搜索」後,將查詢發送到服務器的事件觸發器。 我想要做的就是禁用屏幕鍵盤上的「搜索」按鈕,但是在相應的EditText中尚未輸入任何文本。

我已將此添加到EditText

android:imeOptions="actionSearch"

所以這就是爲什麼鍵盤已經在默認的代替患上了「搜索」按鈕「中輸入」 /「完成」。 (以防萬一你想知道)。

回答

16

我們不能關閉Android鍵盤上的操作按鈕。你必須在編輯器動作監聽器中檢查空字符串。

+0

這很糟糕。我想檢查一個空字符串將不得不做。我會選擇這個答案,因爲它是我的問題的真正答案,而不僅僅是替代方案。 – Pieter888

-1
SearchInput.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub 
      if(SearchInput.getText().toString().length() == 0) 
      { 
       Search.setClickable(false); 
      } 
     } 

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


     } 

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

    }); 

或試試這個..!花式錯誤dilog

Search.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      if(searchinput.getText().toString().length() == 0) 
      { 
       searchinput.setError("Enter something Blah Blah..!"); 
      } 
      else 
      { 


     // Original Functions Goes Here 
      } 

使用下面的代碼在編輯文字,

android:imeOptions="flagNoEnterAction" 

我不能設置flagNoEnterAction = "false" 但有人可以幫你

+0

這隻適用於如果搜索按鈕是我自己在應用程序中的按鈕。但是我正在討論禁用Android鍵盤上的輸入/搜索鍵。 – Pieter888

+0

我不會upvote這個答案,因爲它不是我的問題的有效答案。我想禁用android的屏幕鍵盤的搜索按鈕。不是我的應用程序中的按鈕。 – Pieter888

+0

回答編輯,添加第3個代碼,可能會幫助您或其他人至少 – VenomVendor

0

試試這個(可能並不是你想要的確切結果,但可能是最接近的。

1)拆下機器人:從XML

2)創建自定義TextWatcher addTextChangedListener(TextWatcher守望者),允許您更改鍵盤動態像這樣

textMessage = (EditText)findViewById(R.id.textMessage); 
textMessage.addTextChangedListener(new TextWatcher(){ 
     public void afterTextChanged(Editable s) { 
      if(firstTime){//a boolean you init to true 
      firstTime = false; 
      textMessage.setImeOptions(EditorInfo.IME_ACTION_SEARCH); 
     } 
     public void beforeTextChanged(CharSequence s, int start, int count, int after){} 
     public void onTextChanged(CharSequence s, int start, int before, int count){} 
    }); 
+0

我嘗試過,但在創建視圖後無法更改按鈕的ImeOptions。但無論如何,它並不覺得正確的解決方案,因爲我希望輸入/搜索按鈕被禁用,直到輸入內容。如果這個答案有效,它會在輸入按鈕上顯示文字「完成」而不是「搜索」。我只想讓按鈕變灰或顯示用戶他/她無法搜索空字符串。 – Pieter888

0

imeOptions = 「actionSearch」 你需要製作自定義EditText,在其中擴展EditText和@Override Below方法。

以下是示例代碼。

private ArrayList<Integer> keysToIgnore = new ArrayList<Integer>(); 

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

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

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



private Boolean keyInIgnoreList(int keyCode) {  
     for (Integer i:keysToIgnore){ 
      int key = i.intValue(); 
      if (key == keyCode) 
       return true; 
     } 
     return false; 
    } 

    public void addKeyToIgnoreList(int keyCode) { 

     if (!keyInIgnoreList(keyCode)){ 
      keysToIgnore.add(keyCode); 
     } 
    } 

    public void removeKeyFromIgnoreList(int keyCode) { 

     if (keyInIgnoreList(keyCode)){ 
      Integer key=new Integer(keyCode); 
      keysToIgnore.remove(key); 
     } 
    } 


@Override 
    public boolean dispatchKeyEventPreIme(KeyEvent event) { 
     //Log.d("ws", "dispatchKeyEventPreIme(" + event + ")"); 

      // swallow the any key in the ignore list 
      if (keyInIgnoreList(event.getKeyCode())) { 
       KeyEvent.DispatcherState state = getKeyDispatcherState(); 
       if (state != null) { 
        if (event.getAction() == KeyEvent.ACTION_DOWN 
          /*&& event.getRepeatCount() == 0*/) { 
         state.startTracking(event, this); 
         return true; 
        } else if (event.getAction() == KeyEvent.ACTION_UP 
          && !event.isCanceled() && state.isTracking(event)) { 
         return true; 
        } 
       } 
      } 
     } 
     return super.dispatchKeyEventPreIme(event); 
    } 

你也可以這樣做搜索關鍵字:

mCustomEditText.setOnEditorActionListener(new OnEditorActionListener() { 

      public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
       if(actionId==EditorInfo.IME_ACTION_SEARCH && event.getAction()==KeyEvent.KEYCODE_SEARCH){ 
        System.out.println("Search pressed........."); 
       } 
       return false; 
      } 
     }); 
+0

即使將enter(66)和search(84)中的keyCode都添加後,它仍然不會忽略它。取消註釋記錄事件的行後,我發現它永遠不會到達'dispatchKeyEventPreIme'。什麼都不輸出到控制檯。 – Pieter888

+0

@ Pieter888當在HTC手機中搜索硬鍵時你會看到'dispatchKeyEventPreIme'這個方法會調用並接收軟鍵盤事件,你可以試試這個'mCustomEditText.setOnEditorActionListener'作爲答案更新。在這個方法中試用軟鍵盤的輸入法。 – Herry

0

Activity實現OnKeyListener

將此keyListener添加到您的EditText

myEditText.setOnKeyListener(this); 

覆蓋onKey()在您的Activity

@Override 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     if(v.getId() == R.id.myEditText) 
     { 
      if(KeyEvent.KEYCODE_ENTER == keyCode) 
      { 
       if(myEditText.getText().toString().equals("") || myEditText.getText().toString().equals(null)) 
       { 
        Toast.makeText(KeyboardTestActivity.this, "Event Eaten", Toast.LENGTH_SHORT).show(); 
        Log.e("onKey", "Event Eaten"); 
        return true; 
       } 
      } 
     } 
     return false; 
    } 

和這樣做將顯示一條吐司,只要您EditText是空的,你按下搜索鍵。

注意onKey()爲keyDown調用兩次,然後調用KeyUp。您將不得不使用KeyEvent實例對其進行過濾,該實例在onKey()方法中作爲參數接收。

+0

我測試了這種方法。它的工作正常..... –

0

OnEditorActionListener附加到您的文本字段,並在actionId等於IME_ACTION_DONE時從其onEditorAction方法返回true。這將防止軟鍵盤從藏身:

EditText txtEdit = (EditText) findViewById(R.id.txtEdit); 
txtEdit.setOnEditorActionListener(new OnEditorActionListener() { 

    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
    if (actionId == EditorInfo.IME_ACTION_DONE) { 
     // your additional processing... 
     return true; 
    } else { 
     return false; 
    } 
    } 
}); 

請參閱本LINKLINK

+0

他想禁用操作按鈕,不會阻止鍵盤隱藏。 – Ronnie

3
setOnEditorActionListener(new TextView.OnEditorActionListener() { 
if (txtView.getText().toString().trim().length() == 0) { 
    Toast.makeText(getApplicationContext(), "Please Enter some text to search", 
    Toast.Short).show(); 
    return true; // returning true will keep the keyboard on 
} 
else search(); 
相關問題