我在android:singleLine="true"
上提供了EditTextPreference
选项,当对话框中的编辑框有焦点时,软件键盘显示“完成”按钮代替Enter键。但是,如果我按下完成按钮,只有软键盘关闭,我仍然需要点击对话框上的完成按钮。
有没有在软件键盘上输入key和ime动作键来关闭对话框并应用新值?
答案 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;
});