2

很抱歉提出一个似乎已经被问过并回答过的问题,但我发现的解决方案似乎都不适合我。我正在创建一个带有EditText的AlertDialog以从用户那里获取一个字符串。显示此对话框时,没有可见的软键盘,只有当用户点击 EditText 时,键盘才会弹出。如何让 EditText 自动获得焦点,并在显示对话框时自动显示键盘?

这是我创建和显示对话框的代码。所有这些都在主 Activity 上的按钮的OnClickListener中。

@Override
public void onClick(View v) {
    final EditText textFileName = new EditText(MainActivity.this);
    textFileName.setRawInputType(Configuration.KEYBOARD_QWERTY);
    textFileName.setInputType(InputType.TYPE_CLASS_TEXT);

    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this)
    .setTitle("Save Data")
    .setMessage("Specify file name for saved data.")
    .setView(textFileName)
    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            // Do the file saving bit here
        }
    })
    .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            // Do whatever you feel is important here
        }
    });
    AlertDialog dialog = builder.create();
    dialog.show();
}

现在我确实搜索了这个问题的解决方案并找到了两个答案,一个在这里另一个在这里。这两个似乎都满足了各自的原始海报,但它们都不适合我,我就是不知道我做错了什么。

这是我的第一次尝试,基于上面的代码和第一个链接中发布的最高投票答案。

@Override
public void onClick(View v) {
    final EditText textFileName = new EditText(MainActivity.this);
    textFileName.setRawInputType(Configuration.KEYBOARD_QWERTY);
    textFileName.setInputType(InputType.TYPE_CLASS_TEXT);

    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this)
    .setTitle("Save Data")
    .setMessage("Specify file name for saved data.")
    .setView(textFileName)
    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            // Do the file saving bit here
        }
    })
    .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            // Do whatever you feel is important here
        }
    });
    AlertDialog dialog = builder.create();
    dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    dialog.show();
}

它本质上是在dialog.show()调用之前添加的一行代码,但它没有任何改变。对话框仍然会弹出最漂亮的 EditText,但没有键盘,直到我点击 EditText。

这是第二个尝试,基于第二个链接中投票最多的答案。

@Override
public void onClick(View v) {
    final EditText textFileName = new EditText(MainActivity.this);
    textFileName.setRawInputType(Configuration.KEYBOARD_QWERTY);
    textFileName.setInputType(InputType.TYPE_CLASS_TEXT);
    textFileName.setOnFocusChangeListener(new OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            textFileName.post(new Runnable() {
                @Override
                public void run() {
                    InputMethodManager inputMethodManager = (InputMethodManager)MainActivity.this.getSystemService(Context.INPUT_METHOD_SERVICE);
                    inputMethodManager.showSoftInput(textFileName, InputMethodManager.SHOW_IMPLICIT);
                }
            });
        }
    });
    textFileName.requestFocus();

    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this)
    .setTitle("Save Data")
    .setMessage("Specify file name for saved data.")
    .setView(textFileName)
    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            // Do the file saving bit here
        }
    })
    .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            // Do whatever you feel is important here
        }
    });
    AlertDialog dialog = builder.create();
    dialog.show();
}

和以前一样的故事。

请问有什么帮助吗?将不胜感激。

4

1 回答 1

1

试试这个,它可以帮助我:

editText.postDelayed(new Runnable() {
    @Override
    public void run() {
        InputMethodManager keyboard = (InputMethodManager) activity
            .getSystemService(Context.INPUT_METHOD_SERVICE);
        keyboard.showSoftInput(editText, 0);
    }
}, 50);
于 2013-08-20T21:27:59.380 回答