繁体   English   中英

为 Android 中的自定义 WebViewClient 类定义和设置选项

[英]Define and set options for custom WebViewClient class in Android

我创建了一个自定义的WebViewClient类,它的交互非常有限——它只能加载亚马逊 URL,不允许点击链接。 amzn.tosmile.amazon在重定向时是允许的)

package com.domain.mypackage;

import android.net.Uri;
import android.view.KeyEvent;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class nonInteractiveWebViewClient extends WebViewClient {

    @Override
    public boolean shouldOverrideKeyEvent (WebView view, KeyEvent event) {
        return true;
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        String host = Uri.parse(view.getUrl()).getHost();

        if ("amzn.to".equals(host)) {
            return false;
        } else if (host != null && host.matches("(?i)^smile\\.amazon.*")) {
            return false;
        } else {
            return true;
        }
    }
}

我想增强这个新类,以便如果我启用一个选项,它将允许点击链接,但只允许点击亚马逊链接。 因此,我添加了一个布尔值,我希望能够从调用 Activity 中设置它。

package com.domain.mypackage;

import android.net.Uri;
import android.view.KeyEvent;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class nonInteractiveWebViewClient extends WebViewClient {

    public boolean canBrowseAmazonSites = false;

    @Override
    public boolean shouldOverrideKeyEvent (WebView view, KeyEvent event) {
        return true;
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        String host = Uri.parse(view.getUrl()).getHost();

        if ("amzn.to".equals(host)) {
            return false;
        } else if (host != null && host.matches("(?i)^smile\\.amazon.*")) {
            return false;
        // Allow clicking of Amazon links
        } else if ( canBrowseAmazonSites && host != null && ( host.matches("(?i)^smile\\.amazon.*") || host.matches("(?i)^www\\.amazon.*") ) ) {
            return false;
        } else {
            return true;
        }
    }
}

我创建了WecViewClient在调用Acttivity如下:

    viewBinding.amazonWebview.getSettings().setJavaScriptEnabled(true);
    viewBinding.amazonWebview.getSettings().setSupportZoom(true);
    viewBinding.amazonWebview.setWebViewClient(new nonInteractiveWebViewClient() {
        @Override
        public void onPageStarted(WebView _param1, String _param2, Bitmap _param3) {
            super.onPageStarted(_param1, _param2, _param3);
            viewBinding.progressBar.setIndeterminate(true);
        }

        @Override
        public void onPageFinished(WebView _param1, String _param2) {
            super.onPageFinished(_param1, _param2);
            viewBinding.progressBar.setIndeterminate(false);
        }

    });

但是我无法弄清楚如何从活动中设置我的布尔值。

我确实想知道 Boolean 是否是正确的方法,或者我是否应该创建一个可以调用来设置 Boolean 的公共方法,但无论哪种方式,我都无法弄清楚如何访问 Boolean 或方法。

我想我已经解决了,但请评论我所做的是否有任何问题。

我已经按照问题留下了课程代码,但已添加到主要活动中的代码中。

因此类代码保持不变:

package com.domain.mypackage;

import android.net.Uri;
import android.view.KeyEvent;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class nonInteractiveWebViewClient extends WebViewClient {

    public boolean canBrowseAmazonSites = false;

    @Override
    public boolean shouldOverrideKeyEvent (WebView view, KeyEvent event) {
        return true;
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        String host = Uri.parse(view.getUrl()).getHost();

        if ("amzn.to".equals(host)) {
            return false;
        } else if (host != null && host.matches("(?i)^smile\\.amazon.*")) {
            return false;
        // Allow clicking of Amazon links
        } else if ( canBrowseAmazonSites && host != null && ( host.matches("(?i)^smile\\.amazon.*") || host.matches("(?i)^www\\.amazon.*") ) ) {
            return false;
        } else {
            return true;
        }
    }
}

但是现在当我将WebViewClient分配给 Activity 中的WebView时,我使用对象名称(而不是匿名?)声明它。

然后我可以从该命名对象访问布尔值,如下所示:

   viewBinding.amazonWebview.getSettings().setJavaScriptEnabled(true);
    viewBinding.amazonWebview.getSettings().setSupportZoom(true);
    viewBinding.amazonWebview.setWebViewClient(amazonWebViewClient = new nonInteractiveWebViewClient() {
        @Override
        public void onPageStarted(WebView _param1, String _param2, Bitmap _param3) {
            super.onPageStarted(_param1, _param2, _param3);
            viewBinding.progressBar.setIndeterminate(true);
        }

        @Override
        public void onPageFinished(WebView _param1, String _param2) {
            super.onPageFinished(_param1, _param2);
            viewBinding.progressBar.setIndeterminate(false);
        }
    });

    amazonWebViewClient.canBrowseAmazonSites = true;

其中amazonWebViewClient在 Activity 类中的amazonWebViewClient如下:

    nonInteractiveWebViewClient amazonWebViewClient;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM