web-dev-qa-db-fra.com

Comment revenir à la page précédente si vous appuyez sur le bouton Précédent dans WebView?

J'ai une application dans laquelle j'ai un WebView où j'affiche des sites Web. Cela fonctionne, cliquer sur un lien de la page Web pour accéder à la page suivante du site Web situé dans mon application. Mais lorsque je clique sur le bouton de retour du téléphone, cela me prend directement dans mon application. Je veux plutôt revenir à la page précédente du site. Comment puis-je faire ceci?

Voici l'exemple de code que j'utilise:

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

J'utilise quelque chose comme ça dans mes activités avec 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);
}

Modifier:

Pour que ce code fonctionne, vous devez ajouter un champ à la variable Activity contenant la vue Web:

private WebView mWebView;

Initialisez-le dans la méthode onCreate() et vous devriez être prêt à partir.

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

Si vous utilisez Android 2.2 et versions ultérieures (ce qui correspond actuellement à la plupart des appareils), le code suivant vous donnera ce que vous voulez.

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

Ceci est ma solution. Cela fonctionne aussi dans 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

Référence complète pour le bouton suivant et la barre de progression: remettre les boutons suivant et suivant dans la vue Web

Si vous voulez aller à la dernière page lorsque vous cliquez sur le bouton Précédent du téléphone, utilisez ceci:

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

Vous pouvez également créer un bouton de retour personnalisé comme ceci:

btnback.setOnClickListener(new View.OnClickListener() {

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

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

Pourquoi ne pas utiliser onBackPressed()?

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

    // Go to the previous web page.
}
14

La mise au point doit également être cochée dans OnBackPressed

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

voici un code avec confirmation sortie:

@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

La première réponse de FoamyGuy est correcte mais j'ai quelques ajouts; une faible réputation ne peut me permettre de faire des commentaires. Si, pour certaines raisons, le chargement de votre page échoue, assurez-vous de définir un indicateur pour prendre note de l'échec, puis de le vérifier sur le remplacement onBackPressed. Sinon, votre canGoBack () sera exécuté à jamais sans activer le retour à l'activité réelle, le cas échéant:

//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

Les bibliothèques suivantes de votre classe doivent gérer le onBackKeyPressed. canGoBack () vérifie si la vue Web peut faire référence à la page précédente. Si cela est possible, utilisez la fonction goBack () pour référencer la page précédente (revenir en arrière).

 @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

Voici la solution Kotlin:

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