webentwicklung-frage-antwort-db.com.de

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

Ich habe eine App, in der ich ein WebView habe, in dem ich einige Websites anzeige. Wenn Sie auf einen Link auf der Webseite klicken, gelangen Sie zur nächsten Seite auf der Website in meiner App. Wenn ich jedoch auf die Zurück-Schaltfläche des Telefons klicke, gehe ich direkt in meine App. Ich möchte stattdessen zur vorherigen Seite der Website zurückkehren. Wie kann ich das machen?

Hier ist das Codebeispiel, das 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);
            }
        });
    }
}
299
zvzej

Ich verwende so etwas 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:

Damit dieser Code funktioniert, müssen Sie dem Activity, der die WebView enthält, ein Feld hinzufügen:

private WebView mWebView;

Initialisiere es in der onCreate() Methode und du solltest fertig sein.

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

Wenn Sie Android 2.2 und höher (das sind derzeit die meisten Geräte)) verwenden, erhalten Sie mit dem folgenden Code das, was Sie wollen.

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

Das ist meine Lösung. Es funktioniert auch in 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;
    }
});
99
petrnohejl

Vollständige Referenz für die nächste Schaltfläche und den Fortschrittsbalken: Zurück und nächste Schaltfläche in der Webansicht einfügen

Wenn Sie beim Klicken auf die Zurück-Schaltfläche des Telefons zur Rückseite zurückkehren möchten, gehen Sie folgendermaßen vor:

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

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

btnback.setOnClickListener(new View.OnClickListener() {

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

            if (wv.canGoBack()) {
                wv.goBack();
            }
        }
    }); 
18
Parsania Hardik

Warum nicht onBackPressed() verwenden?

@Override
public void onBackPressed()
{
    // super.onBackPressed(); Do not call me!

    // Go to the previous web page.
}
14

Fokussierung sollte auch in onBackPressed aktiviert sein

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

hier ist ein Code mit Bestätigungs-Exit:

@Override
    public void onBackPressed()
    {
        if(webView.canGoBack()){
            webView.goBack();
        }else{
            new AlertDialog.Builder(this)
            .setIcon(Android.R.drawable.ic_dialog_alert)
            .setTitle("Exit!")
            .setMessage("Are you sure you want to close?")
            .setPositiveButton("Yes", new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    finish();    
                }

            })
            .setNegativeButton("No", null)
            .show();    
        }   
    }
9
Mohammed Ahmed
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    // Check if the key event was the Back button and if there's history
    if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
        myWebView.goBack();
        return true;
    }
    // If it wasn't the Back key or there's no web page history, bubble up to the default
    // system behavior (probably exit the activity)
    return super.onKeyDown(keyCode, event);
}
6
Mahesh

Die erste Antwort von FoamyGuy ist richtig, aber ich habe einige Ergänzungen; Geringe Reputation kann mir keine Kommentare erlauben. Wenn Ihre Seite aus bestimmten Gründen nicht geladen werden kann, stellen Sie sicher, dass Sie ein Flag setzen, um den Fehler zu notieren, und überprüfen Sie es dann bei der Überschreibung von onBackPressed. Andernfalls wird Ihr canGoBack () für immer ohne Überschrift zur eigentlichen Back-Aktivität ausgeführt, wenn es dort war:

//flag with class wide access 
public boolean ploadFailFlag = false;

//your error handling override
@Override
public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {
    onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());
    ploadFailFlag = true;       //note this change 
    .....
    .....
}

//finally to the answer to this question:
@Override
public void onBackPressed() {
    if(checkinWebView.canGoBack()){
        //if page load fails, go back for web view will not go back - no page to go to - yet overriding the super 
        if(ploadFailFlag){
            super.onBackPressed();
        }else {
            checkinWebView.goBack();
        }
    }else {
        Toast.makeText(getBaseContext(), "super:", Toast.LENGTH_LONG).show();
        super.onBackPressed();
    }
}
1
Ajowi

Sie sollten die folgenden Bibliotheken in Ihrer Klasse für onBackKeyPressed verwenden. canGoBack () prüft, ob die Webansicht auf die vorherige Seite verweisen kann. Wenn es möglich ist, verwenden Sie die Funktion goBack (), um auf die vorherige Seite zu verweisen (zurück).

 @Override
        public void onBackPressed() {
          if( mWebview.canGoBack()){
               mWebview.goBack(); 
           }else{
            //Do something else. like trigger pop up. Add rate app or see more app
           }
  }
1
Daniel Nyamasyo

Hier ist die Kotlin-Lösung:

override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {
    if (event?.action != ACTION_UP || event.keyCode != KEYCODE_BACK) {
        return super.onKeyUp(keyCode, event)
    }

    if (mWebView.canGoBack()) {
        mWebView.goBack()
    } else {
        finish()
    }
    return true
}
0
Gibolt