59 votes

Taper sur un champ de formulaire dans WebView n’affiche pas le clavier virtuel

J'ai créé mon propre WebView et définir la WebChromeClient et WebViewClient objets. Quand j'ai commencer cette WebView, les champs de formulaire HTML réagir quand je les touche (un curseur s'affiche), mais ils n'ont pas choisi, ni le clavier commencer. Si j'utilise la boule de commande pour choisir la forme et de la presse, le clavier ne s'affiche.

J'ai essayé d'appeler myWebview.requestFocusFromTouch() que cette réponse suggérée, mais elle renvoie false et ne l'aide pas.

96voto

androidchen Points 866

http://code.google.com/p/android/issues/detail?id=7189

Voici une solution au cas où d'autres ne seraient pas clairs.

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

29voto

Steve Points 312

Accord 10% avec la réponse de Dv_MH. Cependant, la classe attachée était un peu excessive. Tout ce que j'avais à faire était d'étendre WebView et de retourner true pour 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;
    }
}
 

A partir de là, j'ai pu l'utiliser comme une WebView normale (même dans les dialogues).

Alternativement, avec moins de code:

 WebView web = new WebView(context) {
  @Override
  public boolean onCheckIsTextEditor() {
    return true;
  }
};
 

4voto

Dv_MH Points 173

AndroidChen la réponse n'a pas de travail pour moi, mais j'ai cherché sur le lien fourni (http://code.google.com/p/android/issues/detail?id=7189) et j'ai trouvé la classe suivante, il fonctionne parfaitement (Android Froyo sur HTC Bravo), et pas seulement du texte, mais aussi tous les boutons, les redirections, etc, tout fonctionne parfaitement :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;
    }
}

et puis pour créer une webview dans une boîte de dialogue, j'ai écrit ce code

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X