2012-01-30 59 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即可。