404 Stimmen

Wie kehre ich zur vorherigen Seite zurück, wenn die Zurück-Taste in WebView gedrückt wird?

Ich habe eine App, in der ich eine WebView habe, in der ich einige Websites anzeigen. Es funktioniert, wenn ich auf einen Link in der Webseite klicke, wird die nächste Seite auf der Website in meiner App geöffnet. Aber wenn ich auf die Zurück-Taste des Telefons drücke, bringt es mich direkt in meine App. Ich möchte stattdessen zur vorherigen Seite auf der Website zurückkehren. Wie kann ich das machen?

Hier ist der Code-Ausschnitt, den ich verwende:

public class Webdisplay extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
        setContentView(R.layout.webdisplay);

        getWindow().setFeatureInt(Window.FEATURE_PROGRESS,
                Window.PROGRESS_VISIBILITY_ON); 

        Toast loadingmess = Toast.makeText(this,
                "Cargando El Diario de Hoy", Toast.LENGTH_SHORT);
        loadingmess.show();

        WebView myWebView;

        myWebView = (WebView) findViewById(R.id.webview);
        myWebView.getSettings().setJavaScriptEnabled(true);
        myWebView.loadUrl("http://www.elsalvador.com");
        myWebView.setWebViewClient(new WebViewClient());
        myWebView.setInitialScale(1);
        myWebView.getSettings().setBuiltInZoomControls(true);
        myWebView.getSettings().setUseWideViewPort(true);

        final Activity MyActivity = this;
        myWebView.setWebChromeClient(new WebChromeClient() 
        {
            public void onProgressChanged(WebView view, int progress)   
            {
                MyActivity.setTitle("Loading...");
                MyActivity.setProgress(progress * 100); 

                if(progress == 100)
                    MyActivity.setTitle(R.string.app_name);
            }
        });
    }
}

0 Stimmen

593voto

FoamyGuy Punkte 46127

Ich benutze etwas Ähnliches in meinen Aktivitäten mit WebViews:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (event.getAction() == KeyEvent.ACTION_DOWN) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                if (mWebView.canGoBack()) {
                    mWebView.goBack();
                } else {
                    finish();
                }
                return true;
        }

    }
    return super.onKeyDown(keyCode, event);
}

Bearbeiten:

Um diesen Code zum Laufen zu bringen, müssen Sie ein Feld zur Activity hinzufügen, das den WebView enthält:

private WebView mWebView;

Initialisieren Sie es in der onCreate() Methode und Sie sollten bereit sein zu gehen.

mWebView = (WebView) findViewById(R.id.webView);

1 Stimmen

Wo soll ich diesen Code platzieren? Unter meinem gesamten Code? Oder nur unter der loadUrl wie beim builtinZoom?

3 Stimmen

Du würdest es innerhalb deiner Aktivität platzieren, aber außerhalb der onCreate() Methode.

0 Stimmen

Wenn ich deinen Code platziere, erhalte ich einen Fehler für die Variable mWebView, da sie außerhalb der onCreate ist. Wo soll ich diese Variable platzieren?

350voto

Kevin Westwood Punkte 7581

Wenn Sie Android 2.2 oder höher verwenden (was bei den meisten Geräten der Fall ist), erhalten Sie mit folgendem Code, was Sie möchten.

@Override
public void onBackPressed() {
    if (webView.canGoBack()) {
        webView.goBack();
    } else {
        super.onBackPressed();
    }
}

7 Stimmen

Schön. Ich benutze eine Variation dieser Antwort, aber ohne den "else" Block. Andernfalls landet der Benutzer bei zu vielen Rückwärtsklicks auf einem leeren App-"Start" Bildschirm, ohne die Möglichkeit, vorwärts zu gehen.

1 Stimmen

Dies scheint die passendste Antwort zu sein. @CaffeineComa, du könntest wahrscheinlich einfach den Startbildschirm deiner App so codieren, dass er nicht im "Aktivitäts" -Verlauf der App angezeigt wird. Füge einfach das Attribut android:noHistory="true" im hinzu, das du im AndroidManifest.xml möchtest.

0 Stimmen

Sollte dies return; tun? Es tut es im Schulungshandbuch.

137voto

petrnohejl Punkte 7361

Dies ist meine Lösung. Es funktioniert auch im Fragment.

webView.setOnKeyListener(new OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            WebView webView = (WebView) v;

            switch(keyCode) {
                case KeyEvent.KEYCODE_BACK:
                    if (webView.canGoBack()) {
                        webView.goBack();
                        return true;
                    }
                    break;
            }
        }

        return false;
    }
});

17 Stimmen

Dies ist meine Meinung, dies sollte die richtige Antwort sein.

2 Stimmen

Warum diese Antwort die richtige Antwort sein sollte? Gibt es Probleme mit den beiden obersten Antworten?

13 Stimmen

@dc7a9163d9 Eine Aktivität möchte möglicherweise mehrere Ansichten oder Objekte haben, die von keyDown abhängig sind. Diese Antwort abstrahiert die Notwendigkeit der Aktivitäts-zu-KeyDown-Abhängigkeit über WebView (was eine bessere Gestaltung ist). Außerdem verwenden neuere Apps fast ausschließlich Fragmente anstelle von Aktivitäten, und diese Antwort unterstützt diesen Anwendungsfall im Gegensatz zu anderen.

21voto

Parsania Hardik Punkte 4494

Vollständige Referenz für den nächsten Button und die Fortschrittsleiste: zurück und nächsten Button in Webview einfügen

Wenn Sie zur vorherigen Seite zurückgehen möchten, wenn Sie auf die Rücktaste des Telefons klicken, verwenden Sie dies:

@Override
public void onBackPressed() {
    if (webView.canGoBack()) {
        webView.goBack();
    } else {
        super.onBackPressed();
    }
} 

Sie können auch einen benutzerdefinierten Zurück-Button erstellen, wie folgt:

btnback.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            if (wv.canGoBack()) {
                wv.goBack();
            }
        }
    });

17voto

Zar E Ahmer Punkte 32557

Das Fokussieren sollte auch in onBackPressed überprüft werden

    @Override
    public void onBackPressed() {
        if (mWebview.isFocused() && mWebview.canGoBack()) {
            mWebview.goBack();       
        } else {
            super.onBackPressed();
            finish();
        }
    }

3 Stimmen

Klingt plausibel, könnten Sie bitte erklären, warum?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X