如果在WebView中按下后退按钮,如何返回上一页?

本文翻译自:How to go back to previous page if back button is pressed in WebView?

I have an app in which I have a WebView where I display some websites. 我有一个应用程序,其中有一个WebView ,可以显示一些网站。 It works, clicking a link in the webpage goes to the next page in the website inside my app. 它的工作原理是,单击网页中的链接可转到应用程序内网站的下一页。 But when I click the phone's back button, it takes me straight into my app. 但是,当我单击手机的后退按钮时,它将带我直接进入我的应用程序。 I want to go back to the previous page in the website instead. 我想回到网站的上一页。 How can I do this? 我怎样才能做到这一点?

Here is the code sample I'm using: 这是我正在使用的代码示例:

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

#1楼

参考:https://stackoom.com/question/PUwP/如果在WebView中按下后退按钮-如何返回上一页


#2楼

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

#3楼

This is my solution. 这是我的解决方案。 It works also 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;
    }
});

#4楼

here is a code with confirm 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();    
        }   
    }

#5楼

Focusing should also be checked in onBackPressed 聚焦也应在onBackPressed中检查

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

#6楼

You should the following libraries on your class handle the onBackKeyPressed. 您应该在您的类中的以下库处理onBackKeyPressed。 canGoBack() checks whether the webview can reference to the previous page. canGoBack()检查Web视图是否可以引用上一页。 If it is possible then use the goBack() function to reference the previous page (go back). 如果可能的话,请使用goBack()函数引用上一页(返回)。

 @Override
        public void onBackPressed() {
          if( mWebview.canGoBack()){
               mWebview.goBack(); 
           }else{
            //Do something else. like trigger pop up. Add rate app or see more app
           }
  }
在项目使用WebView加载H5页面时,遇到返回键直接退出的问题,通常是因为默认的浏览器行为导致的。为了解决这个问题,你可以尝试以下几个步骤: 1. **配置WebView**: - 在AndroidManifest.xml文件,为`<activity>`标签设置`android:configChanges="keyboardHidden|orientation|screenSize"`属性,以防止页面因设备旋转等变化而强制刷新。 2. **处理历史管理**: - 使用`WebViewClient`或`WebChromeClient`,为`onBackPressed()`或`onReceivedNavigationEvent()`方法添加自定义逻辑。比如,当接收到后退事件时,检查当前是否可以返回到H5页面的前一个URL,如果可以,则模拟H5页面内的返回操作。 ```java webview.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // 如果是H5页面的返回链接... if (url.startsWith("javascript:history.back()")) { // ...这里可以执行H5页面的前进或后退逻辑,例如: return false; // 假设你想让用户实际执行这个动作,返回false表示不拦截 } return super.shouldOverrideUrlLoading(view, url); } @Override public void onBackPressed() { // 检查是否可以返回H5页面 if (webView.canGoBack()) { webView.goBack(); } else { finish(); // 如果不能回到H5,再退出应用 } } }); ``` 3. **使用Fragment栈**: - 如果你的应用程序结构是基于Fragments的,可以考虑在Fragment维护一个栈,每当打开一个新的H5页面时,将其push到栈,并在用户按下返回键时检查栈顶是否是H5页面,如果是则pop回上一层。 4. **H5页面实现**: - 在H5页面内,可以在需要的地方添加`window.history.go(-1)`这样的代码,但这可能会受到浏览器的同源策略限制,不是所有情况下都有效。 通过上述调整,你应该能更好地控制用户的返回行为,让它们能在H5页面内部导航,直到真正的退出应用。如果还有疑问,可以考虑在H5页面里添加一个专门用于处理页面返回按钮,避免依赖系统返回键。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值