白蔹_ 2024-05-24 15:03 采纳率: 0%
浏览 82

安卓返回上一级直接跳出webview

安卓在H5页面内跳转后,按下返回键直接回退出了WebView所在的Activity,而不是返回H5页面的上一级,有时候好使有时候不好使

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-05-24 15:04
    关注

    引自免费微信小程序:皆我百晓生

    为了解决这个问题,你需要在Android端处理WebView的返回键事件,确保当用户点击返回键时,WebView会按照预期返回到前一个页面,而不是直接关闭Activity。这里是一个详细的步骤和代码示例来解决这个问题。

    1. 首先,在你的Activity类(通常继承自AppCompatActivity)中,重写onKeyDown()方法。这个方法会在用户按下键盘按键时被调用,包括物理返回键。

    2. onKeyDown()方法中,检查按下的键是否是返回键,并根据当前WebView的状态来决定如何响应。

    以下是完整的Java代码实现:

    import android.content.Intent;
    import android.os.Bundle;
    import androidx.appcompat.app.AppCompatActivity;
    import android.view.KeyEvent;
    import android.webkit.WebChromeClient;
    import android.webkit.WebSettings;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    
    public class MyWebViewActivity extends AppCompatActivity {
    
        private WebView webView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_my_web_view);
    
            webView = findViewById(R.id.web_view);
            WebSettings webSettings = webView.getSettings();
            webSettings.setJavaScriptEnabled(true); // 允许执行JavaScript
            webView.loadUrl("https://your-webpage-url.com"); // 加载你的网页URL
    
            // 设置WebView客户端和浏览器客户端
            webView.setWebViewClient(new WebViewClient());
            webView.setWebChromeClient(new WebChromeClient());
    
            // 添加返回键监听
            webView.setOnKeyListener((v, keyCode, event) -> {
                if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
                    webView.goBack(); // 如果可以返回,就回到上一个页面
                    return true;
                }
                return false;
            });
        }
    
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) { // 当按下返回键且WebView还有历史记录时
                webView.goBack(); // 返回上一个页面
                return true; // 消耗事件,防止系统默认行为
            }
            return super.onKeyDown(keyCode, event);
        }
    }
    

    这段代码首先设置了WebView的基本配置,然后在onCreate()方法中添加了一个监听器,以便在用户按下返回键并且WebView有历史记录时,执行返回操作。同时,我们还重写了onKeyDown()方法,以确保在整个Activity中都能正确处理返回键事件。

    如果你使用的是Kotlin,那么代码会稍有不同,但思路是一样的:

    class MyWebViewActivity : AppCompatActivity() {
    
        private lateinit var webView: WebView
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_my_web_view)
    
            webView = findViewById(R.id.web_view)
            val webSettings = webView.settings
            webSettings.javaScriptEnabled = true
            webView.loadUrl("https://your-webpage-url.com")
    
            webView.webViewClient = WebViewClient()
            webView.webChromeClient = WebChromeClient()
    
            webView.setOnKeyListener { _, keyCode, event ->
                if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
                    webView.goBack()
                    true
                } else {
                    false
                }
            }
        }
    
        override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
            return when {
                keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack() -> {
                    webView.goBack()
                    true
                }
                else -> super.onKeyDown(keyCode, event)
            }
        }
    }
    

    将上述代码替换到你的相应Activity中,这样当用户在H5页面内浏览并按下返回键时,应该会正常返回到上一页,而不会退出WebView所在的Activity。如果你的问题仍然存在,请检查是否有其他地方可能干扰了返回键的行为。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月24日