При нажатии на поле формы в WebView не отображается мягкая клавиатура
Я создал свой собственный WebView и установить WebChromeClient и WebViewClient объекты. Когда я запускаю этот WebView, поля формы HTML реагируют, когда я касаюсь их (появляется курсор), но они не выбираются, и не запускается мягкая клавиатура. Если я использую трекбол, чтобы выбрать форму и нажать ее, появится клавиатура.
Я пытался позвонить myWebview.requestFocusFromTouch()
Как ответ предложил, но он возвращает false и не помогает.
5 ответов:
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; } });
согласились 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 (даже в диалогах).
альтернативно, с меньшим кодом:
WebView web = new WebView(context) { @Override public boolean onCheckIsTextEditor() { return true; } };
важно Я потратил часы на поиск этого, и я решил его, убедившись, что родительский макет, который расширяет "ViewGroup", не имеет свойства
android: descendantFocusability = "blocksDescendants", которые предотвращают фокусировку дочернего макета
или Добавить android: focusable= "true" в webview
ответ 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; } }
а затем, чтобы создать webview в диалоговом окне, я написал этот код
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();
просто добавьте невидимый 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