Android - 以编程方式打开键盘/请求关注AlertDialog

时间:2015-11-17 13:15:15

标签: android

我有一个Android应用程序,我有一个部分可以显示AlertDialog。在那个AlertDialog中,我有一个EditText,它预先填充了来自prefs的值,用户可以更改它。

代码工作正常但是,为了更直观地了解用户体验,我想要做的是当弹出警报对话框时,首选项的预填充值已经突出显示,键盘准备就绪。

到目前为止,我已经完成了输入突出显示,但我无法弹出键盘或以编程方式使请求重点工作。这是我的代码:

private void showPrefixChangerDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Set Pipe Prefix");

    final EditText input = new EditText(this);
    input.setInputType(InputType.TYPE_CLASS_NUMBER);
    input.setGravity(Gravity.CENTER_HORIZONTAL);
    input.setText(pipePrefix);
    input.setSelection(0, 2);
    input.performClick();
    input.requestFocus();
    InputFilter[] filters = new InputFilter[1];
    filters[0] = new InputFilter.LengthFilter(2);
    input.setFilters(filters);

    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(input, InputMethodManager.SHOW_IMPLICIT);


    builder.setView(input);

    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            String finalInput = input.getText().toString();
            saveInputToPrefs(finalInput);
            tv.setText("Pipe Prefix is " + finalInput);
        }
    });
    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
        }
    });
    builder.show();
}

正如您所看到的,我尝试使用performClick()requestFocus()InputManager,但都无济于事。

有没有人遇到过这种情况?任何帮助将非常感谢。谢谢。

2 个答案:

答案 0 :(得分:1)

找到解决方案from this thread

    AlertDialog dialog = builder.create();
    dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

    dialog.show();

我需要谷歌更好

答案 1 :(得分:0)

试试这个(“输入”是你的EditText):

InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
in.showSoftInput(input, InputMethodManager.SHOW_IMPLICIT);