WebView textarea不会popup键盘

当我显示一个WebView ,我看不到popup的软键盘。 硬键盘也不行!

什么是通常的缺点。

我用来访问WebView的代码是:

 package com.example.blahblah; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.os.Handler; import android.preference.PreferenceManager; import android.util.Log; import android.view.KeyEvent; import android.view.Window; import android.webkit.JsResult; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Toast; public class createAccount extends Activity { private static final String LOG_TAG = "Create Account"; private WebView mWebView; private static final String URL = blah_app.urlSelected+"createAccount.html"; private Handler mHandler = new Handler(); @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); Toast.makeText(createAccount.this, "URL = " +URL, Toast.LENGTH_SHORT).show(); getWindow().requestFeature(Window.FEATURE_PROGRESS); setContentView(R.layout.webview); getWindow().setFeatureInt(Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON); mWebView = (WebView) findViewById(R.id.webview); WebSettings webSettings = mWebView.getSettings(); webSettings.setSavePassword(true); webSettings.setSaveFormData(true); webSettings.setJavaScriptEnabled(true); webSettings.setSupportZoom(true); final Activity activity = this; mWebView.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int progress) { activity.setProgress(progress * 1000); } }); mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo"); mWebView.clearCache(true); setProgressBarVisibility(true); mWebView.setWebViewClient(new WebViewClient() { public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show(); } @Override public void onPageFinished(WebView view, String url) { mWebView.loadUrl("javascript:(function () { " + "setVariables("+blah_app.numberSelected+",'"+blah_app.urlSelected+"');" + "})()"); } }); mWebView.loadUrl(URL); } final class DemoJavaScriptInterface { public void setData(String fname, String lname, String gacct, String phone) { SharedPreferences prefCreateAccount = PreferenceManager.getDefaultSharedPreferences(createAccount.this); SharedPreferences.Editor editor = prefCreateAccount.edit(); editor.putString("FirstName", fname); editor.putString("LastName", lname); editor.putString("GmailAcct", gacct); editor.putString("Phone", phone); editor.commit(); } DemoJavaScriptInterface() { } /** * This is not called on the UI thread. Post a runnable to invoke * loadUrl on the UI thread. */ public void clickOnAndroid() { mHandler.post(new Runnable() { public void run() { mWebView.loadUrl("javascript:wave()"); } }); } } /** * Provides a hook for calling "alert" from javascript. Useful for * debugging your javascript. */ final class MyWebChromeClient extends WebChromeClient { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { Log.d(LOG_TAG, message); result.confirm(); return true; } } public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) { startActivity(new Intent(getApplication(), blah_app.class)); return true; } return super.onKeyDown(keyCode, event); } } 

完整的解决scheme比萨那有点多。 它在Android网站( http://code.google.com/p/android/issues/detail?id=7189 )上logging为错误:

 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; } }); 

问题是,当它被加载,因此使用webview没有得到重点

 webView.requestFocus(View.FOCUS_DOWN); 

解决问题。

我很惊讶,即使在Android 4.1(在SGS3上testing),问题仍然存在,重写onTouch()不解决我的问题。

testing代码:

 String HTML = "<html><head>TEST</head><body><form>"; HTML += "<INPUT TYPE=TEXT SIZE=40 NAME=user value=\"your name\">"; HTML += "</form></body></html>"; WebView wv = new WebView(getContext()); wv.loadData(HTML, "text/html", null); final AlertDialog.Builder adb = new AlertDialog.Builder(getContext()); adb.setTitle("TEST").setView(wv).show(); 

我的复杂解决scheme是用MyWebViewreplaceWebView:

 private static class MyWebView extends WebView { public MyWebView(Context context) { super(context); } // Note this! @Override public boolean onCheckIsTextEditor() { return true; } @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_UP: if (!hasFocus()) requestFocus(); break; } return super.onTouchEvent(ev); } } 

一个线路的答案,它很好地工作

 // define webview for browser wb = (WebView) findViewById(R.id.webView1); wb.requestFocusFromTouch(); 

其中wb是我的webView对象

对于那些在WebView处于AlertDialog时寻找解决scheme的人AlertDialog ,这里的答案为我解决了这个问题: 在AlertDialog中显示带有WebView的软键盘(Android)

有同样的问题和非解决scheme的上述工作。 这为我醒了

  <CustomWebView android:id="@+id/webView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:focusable="true" android:focusableInTouchMode="true" /> 

我有同样的问题果冻豆,但没有上述解决scheme为我工作。 这个解决scheme在JellyBean上为我工作

 WebView webView = new WebView(getActivity(), null, android.R.attr.webViewStyle); 

有时android.R.attr.webViewStyle默认不应用。 这确保了风格始终适用。

我有一个类似的问题….后来我发现我的网页视图显示的网页上的文本框被禁用。

检查浏览器页面是否存在同样的问题?

我有完全相同的问题没有上述解决scheme为我工作。 经过多年的努力,我终于find了问题。

我使用WebView呈现的各种网页中的一些不适合Web视图,因此div(或其他html组件)被无形地放置在input字段上。 虽然input字段在触摸时出现,但它们不允许input文字(即使我设法使用追踪球来获得软键盘)。

所以解决scheme。

 WebView.getSettings().setUseWideViewPort(true); 

这并不能完全阻止这个问题,而是使得这个视图更像是一个PC浏览器,这些浏览器是为了devise的。 减less覆盖的变化。

希望这可以帮助你。

试试这个 – >名字是字段的名称,并确保它没有自动聚焦属性。

  mWebView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { mWebView.loadUrl("javascript:document.getElementById(\"firstname\").focus();"); } }); 

为了方便起见,以及其他解决scheme在所有设备上工作或在所有情况下工作的问题,我总是使用一个小的黑客来解决这个问题,而不需要触摸代码,只需添加任何隐藏的editText到包含webView的布局将焦点自动授予整个视图,您不必担心webView文本字段:

 <EditText android:id="@+id/kb_holder" android:layout_width="wrap_content" android:layout_height="match_parent" android:inputType="text" android:maxLines="1" android:visibility="gone" /> 

所以,整个布局将如下所示:

 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:id="@+id/kb_holder" android:layout_width="wrap_content" android:layout_height="match_parent" android:inputType="text" android:maxLines="1" android:visibility="gone" /> <WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout>