Lorsque j'affiche un WebView
, le clavier logiciel n'apparaît pas. Le clavier dur ne fonctionne pas non plus!
Quelles sont les lacunes habituelles.
Le code que j'utilise pour accéder à WebView
est:
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);
}
}
Le problème était que la webview n’obtenait pas le focus quand elle était chargée, donc en utilisant
webView.requestFocus(View.FOCUS_DOWN);
résolu le problème.
La solution complète est un peu plus que ce que Sana avait. Il est documenté comme un bug sur le site Android ( 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;
}
});
Je suis surpris que, même sur Android 4.1 (testé sur SGS3), le problème persiste et que le remplacement de onTouch () ne le résolve pas pour moi.
Code de test:
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();
Ma solution complexe est de remplacer WebView par MyWebView:
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);
}
}
une réponse en ligne et cela fonctionne bien
// define webview for browser
wb = (WebView) findViewById(R.id.webView1);
wb.requestFocusFromTouch();
où wb est mon objet de webView
Pour ceux qui recherchent une solution lorsque la WebView
est dans une AlertDialog
, la réponse apportée ici résout ce problème pour moi: Afficher le clavier logiciel dans AlertDialog avec une vue Web à l'intérieur (Android)
Avait le même problème et non des solutions ci-dessus a fonctionné. Cela a fonctionné pour moi
<CustomWebView
Android:id="@+id/webView"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:focusable="true"
Android:focusableInTouchMode="true" />
J'ai eu le même problème avec Jelly Bean, mais aucune des solutions ci-dessus ne m'a fonctionné. Cette solution a fonctionné pour moi sur JellyBean
WebView webView = new WebView(getActivity(), null, Android.R.attr.webViewStyle);
Parfois, Android.R.attr.webViewStyle n'est pas appliqué par défaut. Cela garantit que le style est toujours appliqué.
J'avais exactement le même problème, aucune des solutions ci-dessus ne fonctionnait pour moi. Après des siècles d'essais, j'ai finalement trouvé le problème.
Certaines des différentes pages Web que je rendais avec WebView ne s'intégraient pas correctement à la vue Web et, par conséquent, un div (ou un autre composant HTML) était placé de manière invisible sur les champs de saisie. Bien que les champs de saisie semblent sélectionnés lorsque vous les touchez, ils ne permettent pas la saisie de texte (même si j’arrivais à obtenir le clavier virtuel avec la boule de commande).
Donc la solution.
WebView.getSettings().setUseWideViewPort(true);
Cela n'arrêtera pas complètement le problème, mais fera en sorte que la vue ressemble davantage à un navigateur PC pour lequel les sites sont conçus. Moins de changement de la superposition.
J'espère que cela vous aide.
essayez ceci -> le prénom est le nom du champ et assurez-vous qu’il n’a pas d’attribut autofocus.
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
mWebView.loadUrl("javascript:document.getElementById(\"firstname\").focus();");
}
});
Pour faciliter les choses, et comme les autres solutions ont des problèmes qui fonctionnent sur tous les périphériques ou dans toutes les conditions, j'utilise toujours un petit hack pour résoudre ce problème sans toucher au code, ajoutez simplement un élément caché editText
à la présentation. contient le webView
qui accordera automatiquement le focus à l'ensemble de la vue et vous n'aurez plus à vous soucier des champs de texte 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" />
Ainsi, toute la mise en page serait comme:
<?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>
J'ai eu un problème similaire .... et plus tard, j'ai constaté que la zone de texte de la page Web sur laquelle mon affichage Web était désactivé était désactivée.
Vérifiez ceci si la page a le même problème dans le navigateur?