Android AlertDialog 中 EditText 的默认焦点和键盘

问题描述 投票:0回答:6

我正在 Android 中使用 AlertDialog.Builder 来快速提示用户输入文本。该对话框显示并且运行良好,但用户必须单击 EditText 字段才能加载软键盘。有什么方法可以打开键盘并在打开对话框时将焦点放在 上?这是我的代码:

final Map<String,Object> rowData = itemList.get(mPosition);
                    final EditText input = new EditText(searchList.getContext());
                input.requestFocus();


                input.setSingleLine();
                final AlertDialog dialog = new AlertDialog.Builder(searchList.getContext())
                .setTitle(StringUtils.getSafeString(rowData.get("label")))
                .setView(input)
                .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) { 
                        rowData.put("value", StringUtils.getSafeString(input.getText()));
                        searchList.invalidateViews();

                    }
                }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        // Do nothing.
                    }
                }).create();
                dialog.show();
android dialog
6个回答
57
投票

使用以下代码。这对我有用。

    editText.setOnFocusChangeListener(new OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            editText.post(new Runnable() {
                @Override
                public void run() {
                    InputMethodManager inputMethodManager= (InputMethodManager) YourActivity.this.getSystemService(Context.INPUT_METHOD_SERVICE);
                    inputMethodManager.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
                }
            });
        }
    });
    editText.requestFocus();

22
投票

以编程方式将焦点设置在 Android 对话框中的 EditText 上时隐藏键盘。

我也遇到了这个问题,这是一个非常简单的修复 - 这是我建议的解决方案。虽然它对我来说适用于 DialogFragments,但我认为它没有理由在你的情况下不起作用。

基本上不会触发软键盘,因为视图是以编程方式创建的。实际的解决方法只是将这一行放入 onCreateDialog 方法中:

dialog.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE);

来自 DialogFragments 的 Android 文档:

如果用户聚焦于 EditText,软键盘将 自动出现。为了迫使我们的事情发生 程序化的焦点,我们称之为 getDialog().getWindow().setSoftInputMode()。请注意,许多窗口 您之前可能在对话框中完成的操作仍然可以 在 DialogFragment 中完成,但您必须调用 getDialog().getWindow() 而不仅仅是 getWindow()。

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    //setup your dialog builder and inflate the view you want here
    ...
    //Make sure your EditText has the focus when the dialog is displayed
    edit.requestFocus();
    //Create the dialog and save to a variable, so we can set the keyboard state
    Dialog dialog = builder.create();
    //now, set to show the keyboard automatically
    dialog.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    return dialog;
}

5
投票

在您的 XML 布局中

致电

<requestFocus/>

在默认的 EditText 中

<EditText 
android:blabla
.... >
<requestFocus/>
</EditText>

1
投票

如果您需要更频繁地使用自定义视图

public class RequestFocusEditText extends AppCompatEditText {
    private RequestFocusEditText self;

    public RequestFocusEditText(final Context context, AttributeSet attrs) {
        super(context, attrs);
        this.self = this;

        setOnFocusChangeListener(new OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                post(new Runnable() {
                    @Override
                    public void run() {
                    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
                    inputMethodManager.showSoftInput(self, InputMethodManager.SHOW_IMPLICIT);
                }
            });
        }
    });
    requestFocus();
    }
}

1
投票

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0); 用于隐藏键盘使用:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(view.getWindowToken(),0);

或尝试下面的代码,但您必须设置 requestFocus() 或您的 edittext

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }
});

0
投票

如果键盘没有出现,即使按

editText.requestFocus()
这意味着窗口未聚焦确保窗口已聚焦

对话框示例,确保您没有将此标志添加到对话框对象

cdd.getWindow().
            setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);

然后

editTextName.requestFocus();
就会很好用。

© www.soinside.com 2019 - 2024. All rights reserved.