Предотвратить скрытие кнопок на мягкой клавиатуре на Android
У меня есть WebView и несколько кнопок в моем макете. В моем WebView есть большой тег. Это приложение используется для редактирования текстовых файлов. Кнопки используются для создания текстовой области внутри моего WebView. Когда пользователь нажимает кнопку (например, кнопку со стрелкой для перемещения текстового представления), он закрывает клавиатуру. Я использовал toggleSoftInput, но это просто переключает клавиатуру, чтобы показать или нет. Я хочу, чтобы кнопки перестали скрывать программную клавиатуру при нажатии кнопки. Я не нашел ничего о моей конкретной проблеме. Я искал недели. У кого-нибудь есть идеи о том, как я могу помешать моим кнопкам скрывать программную клавиатуру на Android?
3 ответа
Решение вашей проблемы может заключаться в том, чтобы клавиатура всегда отображалась и позволяла пользователю закрывать ее после выполнения действий.
InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.toggleSoftInput (InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
Попробуйте этот код в методе onCreate() вашей Activity. Обратите внимание, что если пользователь нажимает кнопку закрытия на клавиатуре или кнопку возврата, он должен закрыть ее. И я думаю, вы не должны вмешиваться в этот сценарий. И когда действия будут выполнены, вы можете закрыть клавиатуру из кода.
Я нахожусь в одной лодке, поэтому, если бы вы когда-нибудь нашли идеальное решение, я бы с удовольствием его услышал.
РЕДАКТИРОВАТЬ: успех! Или, во всяком случае, намного лучше, чем раньше. Я удалил свое старое решение, так как это лучше.
Как указано в /questions/23039670/android-klaviatura-budet-skryita-bez-prichinyi/23039676#23039676, оказывается, что loadData() скрывает клавиатуру. Тем не менее, я обнаружил, что в hideSoftKeyboard() WebView он проверяет InputMethodManager на предмет активности веб-просмотра через imm.isActive (mWebView).
Таким образом, если вы переключите фокус на EditText до loadData() и переключитесь обратно в WebView сразу после этого, клавиатура останется на месте! Он ненадолго переключается на верхний регистр, я думаю, возвращая фокус веб-представлению (на самом деле, кажется, это не всегда происходит, это зависит), но это намного менее заметно, чем мерцание клавиатуры назад и назад.
Суть того, что должно произойти, заключается в следующем.
Расширьте WebView. Дайте ему поле EditText:
public EditText mFocusDistraction;
В конструкторе есть следующие строки:
mFocusDistraction = new EditText(context);
addView(mFocusDistraction);
Затем переопределите loadUrl():
public void loadUrl(String s) {
mFocusDistraction.requestFocus();
super.loadUrl(s);
this.requestFocus();
}
Это должно заставить его работать, в основном. Это немного глючит, так что вот более полный класс:
import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.webkit.WebView;
import android.widget.EditText;
public class WebViewMod extends WebView {
public EditText mFocusDistraction;
public Context mContext;
public WebViewMod(Context context) {
super(context);
init(context);
}
public WebViewMod(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public WebViewMod(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public WebViewMod(Context context, AttributeSet attrs, int defStyle, boolean privateBrowsing) {
super(context, attrs, defStyle, privateBrowsing);
init(context);
}
public void init(Context context) {
// This lets the layout editor display the view.
if (isInEditMode()) return;
mContext = context;
mFocusDistraction = new EditText(context);
mFocusDistraction.setBackgroundResource(android.R.color.transparent);
this.addView(mFocusDistraction);
mFocusDistraction.getLayoutParams().width = 1;
mFocusDistraction.getLayoutParams().height = 1;
}
@Override
public void loadUrl(final String url) {
if (mContext instanceof Activity && this.isFocused()) {
((Activity)mContext).runOnUiThread(new Runnable() {
@Override
public void run() {
mFocusDistraction.requestFocus();
WebViewMod.super.loadUrl(url);
WebViewMod.this.requestFocus();
}
});
} else {
super.loadUrl(url);
}
}
}
Xamarin Android (Альтернатива):
InputMethodManager inputManager = (InputMethodManager)GetSystemService(Context.InputMethodService);
inputManager.ToggleSoftInput (ShowFlags.Forced, HideSoftInputFlags.ImplicitOnly);