2012-01-30 61 views
1

我給android:singleLine="true"選項EditTextPreference,並且當對話框中的編輯框有焦點時,軟件鍵盤顯示「完成」按鈕來代替Enter鍵。但是,如果按下完成按鈕,只有軟件鍵盤關閉,而且我仍然需要單擊對話框上的完成按鈕。如何使EditTextPreference對話框中的Enter鍵工作

反正有軟鍵盤上的回車鍵和時間動作鍵關閉對話框並應用新值嗎?

回答

6

首先,我設置的IME期權IME_ACTION_DONE

mEditTextPreference.getEditText().setImeOptions(EditorInfo.IME_ACTION_DONE); 

然後使用以下代碼保存值並關閉對話框。

mEditTextPreference.getEditText().setOnEditorActionListener(new OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
     if (actionId == EditorInfo.IME_ACTION_DONE){ 
      //mEditTextPreference.setText(mEditTextPreference.getEditText().getText().toString()); 

      //better solution 
      mEditTextPreference.onClick(mEditTextPreference.getDialog(), Dialog.BUTTON_POSITIVE); 
      mEditTextPreference.getDialog().dismiss(); 
      return true; 
     } 
     return false; 
    } 
}); 
+2

謝謝。在調用'dismiss()'之前,我可以通過調用'editPref.onClick(editPref.getDialog(),DialogInterface.BUTTON_POSITIVE);'來欺騙它。這是一種駭人的方式,但這樣我可以重複使用相同的邏輯。 – dasony 2012-03-21 05:06:40

+1

你的解決方案比我的更好,我把它合併到了帖子中。謝謝:D – LZN 2012-03-26 02:35:19

+0

更好的是在你的編輯文本中設置xml佈局中的ime,例如:android:imeOptions =「actionDone」'。 – 2014-05-21 20:34:45

0

您是否嘗試過在編輯文本的XML中使用using android:inputType="textCapSentences"(textCapSentences是衆多選項之一)。我有一個類似的問題,並能夠解決它也讓我控制我可以顯示什麼鍵盤。

舉例來說,如果我有一些領域唯一我可以用android:inputType="number"這將首先顯示的數字鍵盤VS QWERTY鍵盤,也有很多不同的選擇

+0

對不起,我看到這很晚,但我不在乎鍵盤類型。我只想輸入鍵來關閉對話框並應用更改後的值。我想我必須爲此創建自己的對話框。 – dasony 2012-02-02 14:45:39

0

我認爲DialogPreferenceEditText當用戶按下完成按鈕和軟鍵盤應該關閉通常總是關閉本身。爲了在默認情況下實現這種行爲,很容易實現自定義EditTextPreferenceCustomized,然後在任何地方使用它,而不是標準EditTextPreference

import android.app.Dialog; 
import android.content.Context; 
import android.preference.EditTextPreference; 
import android.view.KeyEvent; 
import android.view.View; 
import android.view.inputmethod.EditorInfo; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.TextView.OnEditorActionListener; 

public class EditTextPreferenceCustomized extends EditTextPreference 
{ 
    public EditTextPreferenceCustomized(Context context) 
    { 
     super(context); 
    } 

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

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

    @Override 
    protected void onAddEditTextToDialogView(View dialogView, EditText editText) 
    { 
     super.onAddEditTextToDialogView(dialogView, editText); 

     // editText.setImeOptions(EditorInfo.IME_ACTION_DONE); - uncomment if it's not specified in preferences.xml 

     editText.setOnEditorActionListener(new OnEditorActionListener() 
     { 
      @Override 
      public boolean onEditorAction(TextView v, int actionId, KeyEvent event) 
      { 
       if(actionId == EditorInfo.IME_ACTION_DONE) 
       { 
       onClick(getDialog(), Dialog.BUTTON_POSITIVE); 
       getDialog().dismiss(); 
       return true; 
       } 
       return false; 
      } 
     }); 
    } 
} 

的代碼部分基於從@LZN樂於助人的解決方案,但是這將消除設置的操作偵聽器的Java代碼中每一個偏好的需要。只需將preferences.xml中的所有實例EditTextPreference替換爲com.yourpackage.EditTextPreferenceCustomized即可。