web-dev-qa-db-de.com

Warum lehnt Android WebView Benutzereingaben ab?

Ich entwickle eine Android-Anwendung, die eine WebView zum Anzeigen der Anmeldeseite für Facebook verwendet. Die Seite wird wunderschön geladen, und ich kann die Textfelder für Benutzername und Kennwort auswählen. Die Eingabe in diese Felder funktioniert jedoch nicht. Das heißt, sie haben definitiv einen Eingabefokus (sie haben das orangefarbene Fokusmarkierungsfeld und einen blinkenden Cursor), aber das Eingeben von ihnen bewirkt absolut nichts. Ich bin nicht sicher, aber ich denke, dass die Formular-Schaltflächen möglicherweise ebenfalls abgespielt werden. Sie scheinen die Seite lediglich zu aktualisieren, anstatt das Formular zu senden.

Um klar zu sein, obwohl ich besonders daran interessiert bin, Facebook zum Laufen zu bringen, bin ich mir sicher, dass dies kein Facebook-Problem ist, da auch andere Websites (Google usw.) dasselbe Verhalten zeigen.

Hat jemand eine Idee was das Problem sein könnte?

35
Mac

Es stellte sich heraus, dass anscheinend das WebView keinen Fokus hatte.

Ich entdeckte, dass die Verwendung der Pfeiltasten, um den Fokus auf die Textfelder zu erhalten, dazu führte, dass sie funktionierten. Ich stellte also die Theorie auf, dass es irgendwo ein Problem gab, bei dem etwas nicht fokussiert war. Sicher, das Hinzufügen der folgenden Zeile schien das Problem zu beheben:

webView.requestFocus(View.FOCUS_DOWN);

Ich kann immer noch nicht genau erklären, warum das Problem überhaupt erst aufgetreten ist - die Textfelder sollten funktionieren, unabhängig davon, ob sie durch das Anzapfen von oder durch "Pfeile" den Fokus erhalten -, aber zumindest habe ich eine Lösung, die funktioniert .

Danke für deine Eingabe wf.

44
Mac

@Mac Tut diese einzelne Zeile: 

webView.requestFocus(View.FOCUS_DOWN);

gelöst dein problem Ich habe es in meinem Fall nicht getan, aber das tut:

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

nur für deine referenz.

15
DiveInto

Das sind die meisten haben

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

und wenn immer noch nicht funktioniert, dann wähle eine der folgenden Alternativen

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

});
11
touchchandra

Ich weiß nicht, dass mein Fall genau der gleiche ist wie bei Ihnen.

Ich habe festgestellt, dass eine Zeile hinzufügen kann Problem lösen.

Ich füge nur hinzu 

input{
    -webkit-user-select: text;
}

zu meinem CSS, dann Problem gelöst!

8
newbeeep

Es tut mir leid zu sagen, dass nichts davon für mich funktioniert hat. Ich denke, das hängt von Ihrem Kontext ab. In meinem Fall trat das Problem in einem HTML-Popup auf (absolute div). Alle anderen Eingabefelder waren in Ordnung.

Ich habe herausgefunden, dass es sich um einen Fehler in der Webansicht handelt. Fixierte divs mit anderen fixen/absoluten Positionsdivs unterbrechen Eingabefelder auf der Seite. Daher eine Regel, die ich für Sie formuliert habe (zögern Sie nicht, neu zu formulieren):

Wenn auf Ihrer Seite ein feststehendes div mit nicht standardmäßig positionierten verschachtelten divs (dh absolute, feste, etc.) angezeigt wird, werden folgende absolute positionierte div auf Ihrer Seite Eingabefelder enthalten wird das unerwartete Verhalten erhalten.

Setzen Sie also Ihre Eingabefelder oben auf der Seite (wenn möglich) oder vermeiden Sie absolute Divs, die in anderen festen/absoluten Divs verschachtelt sind. Das sollte helfen.

Ich habe etwas darüber in meinem Blog gepostet, wenn Sie weitere Erklärungen und mögliche Problemumgehungen benötigen: http://Java-cerise.blogspot.com/2012/02/Android-web-view-inputfields-refuse-to.html

6
twingocerise

In meinem Fall stahl TabHost von einem vorherigen Fragment im Back Stack den Fokus bei jedem Tastendruck von der WebView-Eingabe. So habe ich es behoben:

tabHost.addOnAttachStateChangeListener(new OnAttachStateChangeListener() {
  @Override
  public void onViewDetachedFromWindow(View v) {}

  @Override
  public void onViewAttachedToWindow(View v) {
    tabHost.getViewTreeObserver().removeOnTouchModeChangeListener(tabHost);
  }
});

Unter https://code.google.com/p/Android/issues/detail?id=2516 finden Sie weitere Informationen zum Thema.

5

Sie sind sich nicht sicher, ob es sich um ein Problem handelt, da auch andere Websites dasselbe Verhalten zeigen, aber haben Sie Javascript aktiviert? A WebView aktiviert es standardmäßig nicht.

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

Ich habe alle anderen Lösungen ausprobiert, von denen keine funktionierte.

Stattdessen habe ich das WebView erweitert und die InputConnection überschrieben, wodurch KeyEvents ausgelöst wurde.

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
  return new BaseInputConnection(this, false);
}
2
afathman

Es ist mir passiert, dass ich eine Seite in 4.1.2 und 4.2.2 geladen habe und nach einem Suchtag fand ich die Antwort hier (Kommentar # 18). 

Zitat aus dem ursprünglichen Beitrag:

Einige der verschiedenen Webseiten, die ich mit WebView gerendert habe, passten nicht richtig in die WebView und als Ergebnis wurde ein div (oder eine andere HTML-Komponente) unsichtbar über die Eingabefelder gelegt. Obwohl die Eingabefelder bei Berührung als ausgewählt angezeigt wurden, ließen sie keine Texteingabe zu (selbst wenn ich es geschafft habe, die Soft-Tastatur mit dem Trackball aufzurufen).

Also die lösung.

webview.getSettings().setUseWideViewPort(true);

Dies stoppt das Problem nicht vollständig, sondern macht die Ansicht eher wie ein PC-Browser, für den die Websites entwickelt wurden. Weniger Änderung der Überlagerung.

1
Mohsen Afshin

Dieses Problem ist aufgetreten, weil ein Begrüßungsbild angezeigt wird, während der Webview die erste Seite lädt. Ich setze das Webview in onPageFinished auf View.VISIBLE, obwohl Sie Textfelder fokussieren können, die Sie nicht in sie eingeben können. Ich kann auch bestätigen, dass der Fix zum Festlegen des Webview-RequestFocus auf View.FOCUS_DOWN funktioniert.

NB. Wenn ich den Webview auf View.VISIBLE in onResume gesetzt habe, tritt das Problem nicht auf, aber in meinem Fall verschwindet das Splash-Image zu schnell.

1
jhad

Ich verbringe viel Zeit, um dieses Problem zu lösen. Schließlich wurde mir klar, dass es nicht um WebView geht. In meinem Fall habe ich einen Webview-Dialog. Ich möchte die gedrückte Taste betätigen, um den Dialog abzubrechen und die Aktivität zu beenden. Und ich habe folgenden Code geschrieben:

private void setOnBackPressed() {
    this.setOnKeyListener(new OnKeyListener() {
        @Override
        public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                dialog.dismiss();
                activity.finish();
            }
            return true;
        }
    });
}

Wenn ich also die Tastatur verwende, lehnt diese Methode alle Tasteneingaben ab und erscheint dann nicht in den Textfeldern.

Ich habe nur den Rückgabewert in false geändert . Also hat es richtig funktioniert.

Ich hoffe es hilft!!

PS: Diese Methode befindet sich in meiner Dialogklasse, die die Dialogklasse erweitert

1
sembozdemir

Ich habe ein Problem gefunden, das möglicherweise anders ist, aber es klingt ähnlich. Wenn Sie im Android 2.3-Browser eine feste Position auf der Seite haben, werden die Auswahlfelder manchmal unterbrochen.

Eine Problemumgehung für dieses Problem für 2.3-Geräte besteht darin, niemals leere untergeordnete Elemente für eine übergeordnete feste Position zuzulassen. Somit,

<div style="position:fixed">
  <div>
    <span>not empty</span>
    <span></span>
  </div>
</div>

würde werden

<div style="position:fixed">
  <div>
    <span>not empty</span>
    <span>&nbsp;</span>
  </div>
</div>

Das hat mein Problem behoben.

Ich weiß nicht, ob dies das Problem für Ihr Problem war, und dies ist über ein Jahr danach, aber ich dachte, ich würde es Ihnen mitteilen, da ich mich derzeit mit einem anderen festen Postion-Problem einer App beschäftige, und ich habe keine Ahnung. Es wurde eine Problemumgehung dafür gefunden.

0
Daniel

in meinem Kontext (Webview mit einer externen URL) funktioniert dieses Fragment:

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

});

der Fehler liegt darin, dass der Webview bei jeder Berührung den Fokus verlor!

0
edwindh

Ich war mit einem ähnlichen Problem konfrontiert, dass Texteingaben auf Webview nicht funktionieren. Wenn Sie sich auf die Texteingabe konzentrieren, wird Tastatur angezeigt, Sie können jedoch keine Zeichen eingeben.

Nach langer Suche nach einer Lösung habe ich festgestellt, dass das Problem dadurch behoben wird:

body {
    -webkit-transform: translate3d(0,0,0);
    -moz-transform: translate3d(0,0,0);
    -ms-transform: translate3d(0,0,0);
    -o-transform: translate3d(0,0,0);
    transform: translate3d(0,0,0);
}

Wie ich verstanden habe, führt diese Regel dazu, dass einige Geräte ihre Hardwarebeschleunigung ausführen. Weitere Informationen zu translate3d (0,0,0) hier.

Andererseits wird laut diesem Artikel nicht empfohlen, die GPU-Beschleunigung überall einzusetzen.