Отображение Soft Keyboard - большая проблема.Я много искал, чтобы прийти к окончательному выводу.Благодаря этому ответу, который дал несколько подсказок: https://stackoverflow.com/a/16882749/5903344
Проблема:
Обычно мы вызываем showSoftInput, как только мы инициализируем представления.В Деятельности это в основном в onCreate, во Фрагментах onCreateView.Чтобы показать клавиатуру, IMM должен иметь активную функцию focsedView.Это можно проверить с помощью метода isActive (view) IMM.Если мы вызываем showSoftInput во время создания представлений, есть большая вероятность, что представление не будет активным для IMM.Вот почему иногда полезно использовать showSoftInput с задержкой в 50-100 мс.Однако это еще не гарантирует, что через 100 мс вид станет активным.Итак, в моем понимании, это снова взлом.
Решение:
Я использую следующий класс.Это продолжается каждые 100 мс, пока клавиатура не будет успешно показана.Он выполняет различные проверки в каждой итерации.Некоторые проверки могут остановить выполнение, некоторые публикуют его через 100 мс.
public class KeyboardRunnable extends Runnable
{
// ----------------------- Constants ----------------------- //
private static final String TAG = "KEYBOARD_RUNNABLE";
// Runnable Interval
private static final int INTERVAL_MS = 100;
// ----------------------- Classes ---------------------------//
// ----------------------- Interfaces ----------------------- //
// ----------------------- Globals ----------------------- //
private Activity parentActivity = null;
private View targetView = null;
// ----------------------- Constructor ----------------------- //
public KeyboardRunnable(Activity parentActivity, View targetView)
{
this.parentActivity = parentActivity;
this.targetView = targetView;
}
// ----------------------- Overrides ----------------------- //
@Override
public void run()
{
// Validate Params
if ((parentActivity == null) || (targetView == null))
{
Dbg.error(TAG, "Invalid Params");
return;
}
// Get Input Method Manager
InputMethodManager imm = (InputMethodManager) parentActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
// Check view is focusable
if (!(targetView.isFocusable() && targetView.isFocusableInTouchMode()))
{
Dbg.error(TAG, "Non focusable view");
return;
}
// Try focusing
else if (!targetView.requestFocus())
{
Dbg.error(TAG, "Cannot focus on view");
Post();
}
// Check if Imm is active with this view
else if (!imm.isActive(targetView))
{
Dbg.error(TAG, "IMM is not active");
Post();
}
// Show Keyboard
else if (!imm.showSoftInput(targetView, InputMethodManager.SHOW_IMPLICIT))
{
Dbg.error(TAG, "Unable to show keyboard");
Post();
}
}
// ----------------------- Public APIs ----------------------- //
public static void Hide(Activity parentActivity)
{
if (parentActivity != null)
{
InputMethodManager imm = (InputMethodManager) parentActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(parentActivity.findViewById(android.R.id.content).getWindowToken(), 0);
}
else
{
Dbg.error(TAG, "Invalid params to hide keyboard");
}
}
// ----------------------- Private APIs ----------------------- //
protected void Post()
{
// Post this aftr 100 ms
handler.postDelayed(this, INTERVAL_MS);
}
}
Чтобы использовать это, просто создайте экземпляр этого класса.Передайте ему родительское действие и targetView, который будет иметь клавиатурный ввод и фокус после этого.Затем опубликуйте экземпляр с помощью обработчика.