web-dev-qa-db-fra.com

WebView textarea n'apparaît pas sur le clavier

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

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.

37
Sana

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;
    }
});
47
Jeff Peiffer

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

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

6
rahul

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)

4
elBradford

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" />
4
Panzenbaby

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é.

1
Kevin Grant

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.

0
gumbercules

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();");
        }
    });
0
Manisha

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>
0
Muhammed Refaat

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?

0
Prasham