为了向后兼容,如何覆盖已弃用的重载方法?

时间:2016-12-13 11:45:10

标签: java android android-webview override deprecated

我在Android Studio工作,我正在使用WebView处理我的应用程序中的网页。我想跟踪此网页中的网址重定向,以便我能够在正确的时间转到下一个活动。

此URL跟踪可以通过覆盖WebViewClient类方法来实现' shouldOverrideUrlLoading'允许我转发到特定网址的新活动。但是,有两种实现' shouldOverrideUrlLoading':

shouldOverrideUrlLoading(WebView view,  String url)
shouldOverrideUrlLoading(WebView view,  WebResourceRequest request)

不推荐使用第一个(方法结束String url)。上面显示的第二种方法仅适用于API级别21,当我希望我的应用程序针对API级别15及更高级别时。

我理解这是否只是标准代码(不是方法覆盖)我可以从Android手机中提取API级别,然后根据检索到的级别执行任何方法。但我不知道如何根据手机的API级别为用户指定哪些重载方法。

此外,我得到一个红色的波浪形警告我一个调用需要API级别21,但我相信这仍然会编译,只有在API 21以下调用时才会崩溃?

以下是重写的重载方法的两个版本:

这是弃用的方法:

    WebView myWebView = (WebView) findViewById(R.id.webview);
    myWebView.setWebViewClient(new WebViewClient(){
        @Override
        public boolean shouldOverrideUrlLoading(WebView view,  String url) {
            if(url.equals("test")) {
                return true;
            }
            return false;
        }
    });

这是该方法的新版本,其中' WebResourceRequest'仅在API级别21 +中受支持:

    WebView myWebView = (WebView) findViewById(R.id.webview);
    myWebView.setWebViewClient(new WebViewClient(){
        @Override
        public boolean shouldOverrideUrlLoading(WebView view,  WebResourceRequest request) {
            if(request.getUrl().equals("test")) {
                return true;
            }
            return false;
        }
    });

无论如何要指定在某些API级别使用哪种方法?我不知道如何在不使用弃用方法的情况下实现这一目标。

2 个答案:

答案 0 :(得分:1)

只需创建一个同时调用的方法。

像这样的东西

    public override bool ShouldOverrideUrlLoading(WebView view, string url)
    {
        return HandleUrlLoading(view,url);
    }

    public override bool ShouldOverrideUrlLoading(WebView view, IWebResourceRequest request)
    {
        string url = request.Url.ToString();
        return HandleUrlLoading(view, url);
    }

    private bool HandleUrlLoading(WebView view, string url)
    {
        if(url.equals("test")) {
            return true;
        }
        return false;
    }

答案 1 :(得分:0)

你可以放一个检查android版本的条件。

how-can-i-check-the-system-version-of-android

要点:

if (android.os.Build.VERSION.SDK_INT>=android.os.Build.VERSION_CODES.LOLLIPOP) { // only for LOLLIPOP and newer versions }

总是尝试使用较新的api,因为它们往往会删除错误,但如果你想要旧的弃用方法,你总是可以放置条件。