如何在EditTextPreference对话框中输入键

时间:2012-01-30 14:44:11

标签: android android-preferences preferenceactivity

我在android:singleLine="true"上提供了EditTextPreference选项,当对话框中的编辑框有焦点时,软件键盘显示“完成”按钮代替Enter键。但是,如果我按下完成按钮,只有软键盘关闭,我仍然需要点击对话框上的完成按钮。

有没有在软件键盘上输入key和ime动作键来关闭对话框并应用新值?

4 个答案:

答案 0 :(得分:7)

首先,我将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;
    }
});

答案 1 :(得分:0)

您是否在XML中为编辑文本尝试了using android:inputType="textCapSentences"(textCapSentences是众多选项之一)。我有一个类似的问题,能够解决它也让我控制了我可以显示的键盘。

例如,如果我有一个仅限数字的字段,我可以使用android:inputType="number",这将首先显示数字键盘与qwerty键盘,有许多不同的选项

答案 2 :(得分:0)

我认为当用户按下 Done 按钮并关闭软键盘时,DialogPreference EditText 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; } }); } }

EditTextPreference

代码部分基于@LZN的有用解决方案,但这将消除为java代码中的每个首选项设置动作侦听器的需要。只需在preferences.xml中将com.yourpackage.EditTextPreferenceCustomized的所有实例替换为public static double round1(double value, int scale) { return Math.round(value * Math.pow(10, scale)) / Math.pow(10, scale); }

答案 3 :(得分:0)

如果要使用代码中的EditText创建AlertDialog:

AlertDialog.Builder dialog = new AlertDialog.Builder(this, R.style.MyAlertDialogStyle);
// (do other stuff here with dialog)
EditText et = new EditText(this);
et.setImeOptions(EditorInfo.IME_ACTION_DONE); // show "Done" on keyboard
// (do other stuff here with et)
AlertDialog createDialog = dialog.create();
createDialog.show();

...您可以像这样“按下”肯定按钮:

et.setOnEditorActionListener((v, actionId, event) -> {
    if (actionId == EditorInfo.IME_ACTION_DONE) { 
        createDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
            return true;
        }
        return false;
    });