В поле формы ввода в WebView не отображается мягкая клавиатура
Я создал свой собственный WebView и установил объекты WebChromeClient и WebViewClient. Когда я запускаю этот WebView, поля формы HTML реагируют, когда я прикасаюсь к ним (появляется курсор), но они не выбираются, и не запускается мягкая клавиатура. Если я использую трэкбол для выбора формы и нажмите ее, клавиатура появится.
Я попытался вызвать myWebview.requestFocusFromTouch()
как этот ответ, но он возвращает false и не помогает.
Ответы
Ответ 1
http://code.google.com/p/android/issues/detail?id=7189
Вот исправление, если другие не были ясны.
webview.requestFocus(View.FOCUS_DOWN);
webview.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_UP:
if (!v.hasFocus()) {
v.requestFocus();
}
break;
}
return false;
}
});
Ответ 2
Согласовано 10% с ответом Dv_MH. Однако приложенный класс был немного чрезмерным. Все, что мне нужно было сделать, это расширить WebView и вернуть значение true для onCheckIsTextEditor()
import android.content.Context;
import android.util.AttributeSet;
import android.webkit.WebView;
public class LiveWebView extends WebView {
public LiveWebView(Context context) {
super(context);
}
public LiveWebView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public LiveWebView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onCheckIsTextEditor() {
return true;
}
}
Оттуда я смог использовать его как обычный WebView (даже в Dialogs).
Альтернативно, с меньшим количеством кода:
WebView web = new WebView(context) {
@Override
public boolean onCheckIsTextEditor() {
return true;
}
};
Ответ 3
ВАЖНО
Я потратил часы на поиск этого, и я решил его, убедившись, что родительский макет, который расширяет "ViewGroup", не имеет свойства
android: descendantFocusability = "blocksDescendants", которые предотвращают фокусировку дочернего макета
ИЛИ
Добавить android: focusable = "true" для веб-просмотра
Ответ 4
Ответ на AndroidChen не работал у меня вообще, но я искал предоставленную ссылку (http://code.google.com/p/android/issues/detail?id=7189), и я нашел следующий класс, он отлично работает (Android Froyo на HTC Bravo), а не только текст, но и все кнопки, перенаправления и т.д., все работает отлично: D
class LiveWebView extends WebView
{
Context mContext;
public LiveWebView(Context context, String URL)
{
super(context);
mContext = context;
setWebViewClient(URL);
}
@Override
public boolean onCheckIsTextEditor()
{
return true;
}
@SuppressLint("SetJavaScriptEnabled")
boolean setWebViewClient(String URL)
{
setScrollBarStyle(SCROLLBARS_INSIDE_OVERLAY);
setFocusable(true);
setFocusableInTouchMode(true);
requestFocus(View.FOCUS_DOWN);
WebSettings webSettings = getSettings();
webSettings.setSavePassword(false);
webSettings.setSaveFormData(false);
webSettings.setJavaScriptEnabled(true);
webSettings.setSupportZoom(false);
webSettings.setUseWideViewPort(false);
setOnTouchListener(new View.OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_UP:
if (!v.hasFocus())
{
v.requestFocus();
}
break;
}
return false;
}
});
this.setWebViewClient(new WebViewClient()
{
ProgressDialog dialog = new ProgressDialog(mContext);
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
loadUrl(url);
return true;
}
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
{
Toast.makeText(mContext, "Oh no! " + description, Toast.LENGTH_SHORT).show();
}
public void onPageStarted(WebView view, String url, Bitmap favicon)
{
if (dialog != null)
{
dialog.setMessage("Loading...");
dialog.setIndeterminate(true);
dialog.setCancelable(true);
dialog.show();
}
}
public void onPageFinished(WebView view, String url)
{
if (dialog != null)
{
dialog.cancel();
}
}
});
this.setWebChromeClient(new WebChromeClient()
{
public void onProgressChanged(WebView view, int progress)
{
// Activities and WebViews measure progress with different scales.
// The progress meter will automatically disappear when we reach 100%
}
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result)
{
result.confirm();
return true;
}
});
loadUrl(URL);
return true;
}
}
а затем, чтобы создать веб-просмотр в диалоговом окне, я написал этот код
AlertDialog.Builder alert = new AlertDialog.Builder(M_PaymentOptions.this);
alert.setNegativeButton("Back to Payment Options", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int id)
{}
});
alert.setTitle("BarclayCard Payment");
LiveWebView liveWevViewObject = new LiveWebView(M_PaymentOptions.this, redirecturl);
alert.setView(liveWevViewObject);
alert.show();
Ответ 5
Просто добавьте невидимый EditText в WebView
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="invisible" />
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
Все эти связанные с фокусом решения не работали на моем Samsung Note 3/Android 5.0