Ответ 1
Я сделал такую вещь
AlertDialog.Builder b = new AlertDialog.Builder(this);//....
AlertDialog dialog = b.create();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
dialog.show();
Я использую AlertDialog.Builder, чтобы создать поле ввода, с помощью EditText в качестве метода ввода.
К сожалению, Soft Keyboard не появляется, хотя EditText находится в фокусе, если вы явно не коснетесь его снова.
Есть ли способ заставить его pop?
Я пробовал следующее: после (AlertDialog.Builder).show();, но безрезультатно.
InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(input, InputMethodManager.SHOW_FORCED);
Любой может помочь?
Спасибо!!
Я сделал такую вещь
AlertDialog.Builder b = new AlertDialog.Builder(this);//....
AlertDialog dialog = b.create();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
dialog.show();
Мне удалось решить его вот так:
Dialog = builder.create();
Dialog.show();
Dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
Dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
Я узнал, что тот же самый код работает правильно на планшете, клавиатура всплывает, но на телефоне этого нет, поэтому, исследуя дальше, кажется, указывается на параметр "настроить".
Я использую это, чувствую себя намного чище.
AlertDialog d = builder.create();
d.getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
d.show();
В моем случае единственным способом показать клавиатуру, когда был показан диалог, было добавление к моему DialogFragment
:
@Override
public void onResume() {
super.onResume();
getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
myEditText.requestFocus();
}
Обратите внимание на SOFT_INPUT_STATE_ALWAYS_VISIBLE вместо SOFT_INPUT_STATE_VISIBLE.
Из документации:
int SOFT_INPUT_STATE_ALWAYS_VISIBLE
Visibility state for softInputMode: please always make the soft input area visible when this window receives input focus.
Когда вы вызываете showDialog, чтобы показать диалог, созданный с помощью AlertDialog в onCreateDialog
Здесь вы должны ввести код
@Override
protected void onPrepareDialog (int id, Dialog dialog, Bundle args)
{
TextView editText=(TextView) dialog.findViewById(R....);
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);
}
}
});
}
Намного лучшее решение дано здесь.
dialog.getWindow().clearFlags(
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
|WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
Нет обходного пути. EditText
ведет себя так, как ожидалось.
Window window = dialog.getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
На это уже был дан ответ здесь. Использование OnFocusChangeListener сработало для меня.
Попробуйте это, его работа для меня
Если вы хотите отобразить мягкую клавиатуру:
InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(input.getWindowToken(), 0);
И если вы хотите скрыть это:
InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(input.getWindowToken(), 0);
final AlertDialog.Builder alert = new AlertDialog.Builder(context);
final AlertDialog dialog = alert.show();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
Можете себе представить, что я начал здесь, чтобы получить ответ, только чтобы прийти и дать точный ответ.
Во-первых, позвольте мне указать, что InputMethodManager.showSoftInput не использует флаг SHOW_FORCED. Используются только 0 и SHOW_IMPLICIT.
РЕШЕНИЕ 1
Здесь мы понимаем, что у Android есть проблемы. Часто функции Android не работают из-за неполной инициализации. Звучит безумно, но я считаю, что объекты Android не ведут себя нормально. Нормальные объекты полностью инициализируются при построении, но объекты Android должны пройти через вызовы функций: onCreate, onStart, onThis, onThat.Android знает это, поэтому каждый View имеет функцию post и postDelayed; какая инструкция публикации в очереди сообщений представления, которая должна быть обработана.
Ниже приведен рабочий пример из моего проекта....
SRC/яв /Android/Util.java
package jav.android;
import android.app.*;
import android.content.*;
import android.graphics.*;
import android.view.*;
import android.view.inputmethod.*;
public class Util
{
public static void showKeyboard(final Context ctx,final View view)
{
Runnable r = new Runnable()
{
@Override public void run()
{
if(view.requestFocus())
{
InputMethodManager imm = (InputMethodManager)ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}
}
};
view.post(r);
}
// Note that we dont need to use View.post() here
public static void hideKeyboard(Context ctx,View view)
{
InputMethodManager imm = (InputMethodManager)ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY);
}
}
РЕШЕНИЕ 2
Добавить в XML как содержимое EditText. Это обеспечит фокусировку EditText на начальном этапе. Таким образом, вам не нужно запрашивать его программно и, следовательно, нет необходимости использовать View.post(Runnable).
& Л;... Макет>
Используйте InputMethodManager, чтобы показать клавиатуру.
InputMethodManager imm = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
РЕЗЮМЕ
Мои ответы выше ответили на ваш конкретный вопрос. Тем не менее, вы можете заметить, что клавиатура всплывает изначально, но после минимизации активности и всплывающего назад, EditText имеет фокус, но клавиатура отсутствует. Другая проблема, с которой я столкнулся, была, когда я нажимал назад, я хотел, чтобы клавиатура пропадала навсегда, пока пользователь снова не нажмет текстовое поле.