AlertDialog с EditText, автоматически открывать мягкую клавиатуру с фокусом на EditText не работает
Я пытаюсь получить часть работы с кодом, которая должна сфокусировать EditText в AlertDialog, как только он появится, и затем автоматически открыть мягкую клавиатуру. Вместо этого он просто делает экран темнее.
Builder builder = new Builder(this);
final EditText input = new EditText(this);
AlertDialog dialog = builder.create();
builder
.setTitle(R.string.dialog_title_addsubject)
.setMessage(R.string.dialog_addsubject)
.setView(input)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
String value = input.getText().toString();
if (input.getText().toString().trim().length() == 0) {
Toast.makeText(Main.this, R.string.input_empty, Toast.LENGTH_SHORT).show();
} else {
db.insertSubject(value);
getData();
}
}
})
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
});
input.requestFocus();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
dialog.show();
Я пробовал много способов сделать это, но никто не работал. Надеюсь, вы, ребята, можете мне помочь. Спасибо заранее!
Ответы
Ответ 1
Хорошо мне удалось заставить его работать:
Builder builder = new Builder(this);
final EditText input = new EditText(this);
builder
.setTitle(R.string.dialog_title_addsubject)
.setMessage(R.string.dialog_addsubject)
.setView(input)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
String value = input.getText().toString();
if (input.getText().toString().trim().length() == 0) {
Toast.makeText(Main.this, R.string.input_empty, Toast.LENGTH_SHORT).show();
} else {
db.insertSubject(value);
getData();
}
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(input.getWindowToken(), 0);
}
})
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(input.getWindowToken(), 0);
}
});
builder.show();
input.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
Этот метод не нуждается в диалоговом окне, поэтому я могу использовать builder.show(), чтобы показать диалог, а код, предоставленный Sabre, открывает мягкую клавиатуру. Еще один фрагмент кода в каждой из кнопок автоматически закрывает мягкую клавиатуру.
Ответ 2
Вы можете использовать это вместо
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
Вызвать это после dialog.show();
Ответ 3
public void selectContact(Context context) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setIcon(R.mipmap.icon);
builder.setTitle(R.string.title);
builder.setPositiveButton(android.R.string.ok, context);
builder.setNegativeButton(android.R.string.cancel,context);
builder.setView(View.inflate(context,
R.layout.dialog, null));
AlertDialog alertDialog = builder.create();
alertDialog.setOnShowListener(this); //Add listener
alertDialog.show();
}
открыть keyborad в onShow: -
@Override
public void onShow(DialogInterface dialog) {
EditText editText = (EditText) ((AlertDialog) dialog).findViewById(R.id.number);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}
Ответ 4
Попробуйте показать его через секунду -
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
input.requestFocus();
dialog.getWindow().
setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
dialog.show();
}, 1000)