36 votes

Pourquoi Android WebView refuse-t-il la saisie de l'utilisateur?

Je voudrais développer une application Android qui utilise une WebView pour afficher la page de connexion de Facebook. La page se charge à merveille, et je suis en mesure de sélectionner le nom d'utilisateur/mot de passe de zones de texte, mais en tapant dans leur travail. Qui est, sans aucun doute, ils ont le focus d'entrée (ils ont l'orange se concentrer zone de surbrillance et un curseur clignotant), mais en tapant dans leur ne fait absolument rien. Je ne suis pas certain, mais je pense que peut-être la forme des boutons sont aussi en train de jouer jusqu' - ils semblent être tout simplement rafraîchissant la page, plutôt que de soumettre le formulaire.

Juste pour être clair, même si je suis particulièrement intéressé par l'obtention de Facebook en cours, je suis sûr que ce n'est pas un Facebook question depuis d'autres sites web (Google, etc) ont aussi le même comportement.

Quelqu'un a une idée de ce que pourrait être le problème?

45voto

Mac Points 8532

Il s'avère que c'était apparemment la WebView ne pas avoir l'accent qui a été la question.

J'ai découvert qu'en utilisant les touches de direction pour obtenir l'accent sur les zones de texte à l'origine de leur travail, de sorte que j'ai théorisé qu'il y a un problème quelque part avec quelque chose de ne pas avoir le focus, le plus probable de la WebView ne pas avoir le focus. Bien sûr, en ajoutant la ligne suivante semble résoudre le problème:

webView.requestFocus(View.FOCUS_DOWN);

Je suis toujours à une perte d'expliquer exactement pourquoi le problème s'est produite en premier lieu - les zones de texte devrait fonctionner si elles reçoivent le focus de saisie sur ou par le biais de cours "flèches" - mais, au moins, j'ai une solution qui semble fonctionner.

Merci pour vos commentaires wf.

15voto

DiveInto Points 599

@Mac Fait cette seule ligne:

 webView.requestFocus(View.FOCUS_DOWN);
 

résolu votre problème? Je ne l'ai pas fait dans mon cas, mais cela fait:

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

juste pour votre référence.

14voto

touchchandra Points 174

Ce sont la plupart ont

 webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setUseWideViewPort(true);
webview.requestFocus(View.FOCUS_DOWN);
 

et si cela ne fonctionne toujours pas, utilisez une alternative ci-dessous

Alternative 1

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

Alternative 2

 webview.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_UP:
                v.requestFocusFromTouch();  
                break;
        }               
        return false;
    }

});
 

6voto

twingocerise Points 89

Je suis désolé de dire que rien de tout cela a fonctionné pour moi. Je suppose que cela dépend de votre contexte. Dans mon cas, le problème est survenu dans un html pop up (absolue div). Tous les autres champ de saisie ont été fait ok.

En décomposant le problème que j'ai trouvé c'est un bug dans la webview. Fixe positionné divs contenant d'autres fixe/position absolue divs pause champs de saisie de la page. Par conséquent, une règle que j'ai rédigé pour vous (ne pas hésiter à reformuler):

Si dans votre page, vous avez un fixe positionné div avec aucun défaut positionné divs imbriqués (c'est à dire l'absolu, fixe, etc.), toute l'absolu placé div dans une page web contenant des champs de saisie obtiendrez le comportement inattendu.

Alors, mettez votre champs de saisie en haut de la page (si vous pouvez) ou d'éviter absolue divs imbriqués dans d'autres fixe/absolue divs. Cela devrait aider.

J'ai posté quelque chose à ce sujet sur mon blog, si vous avez besoin de plus d'explications et de solutions potentielles: http://java-cerise.blogspot.com/2012/02/android-web-view-inputfields-refuse-to.html

2voto

wf. Points 758

Vous ne savez pas si c'est le problème, car d'autres sites Web affichent également le même comportement, mais avez-vous activé javascript? Une WebView ne l’ active pas par défaut.

 WebView webView = (WebView)findViewById(R.id.yourWebView);
webView.getSettings().setJavaScriptEnabled(true);
 

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