【问题标题】:Sample usage of WebViewCompatWebViewCompat 的示例用法
【发布时间】:2018-10-11 16:38:47
【问题描述】:

偶然发现有一个WebView的支持库是AndroidX的一部分:androidx.webkit:webkit:1.0.0

但是我找不到任何关于如何使用它的示例代码,JavaDoc 也没有太大帮助:https://developer.android.com/reference/androidx/webkit/package-summary

这应该由开发人员使用还是内部库?

【问题讨论】:

  • 我也不是很清楚,但我最好的猜测是它在所有平台上提供了一致的 javascript 实现。
  • 在 2018 Android 开发者峰会上找到了一段视频,解释了 Android X 中的新 WebViewCompat:youtube.com/watch?v=HGZYtDZhOEQ 但它不包含有用的代码示例::(

标签: android webview androidx


【解决方案1】:

此库是 WebKitandroidx 抽象(因为它依赖于可更新的 APK)。

WebViewCompat.java 本身告诉“不要实例化这个”(而且 XML 标签是未知的,所以必须使用android.webkit.WebView);但是WebViewCompat 类有几个public static 方法,可以访问; WebViewFeature 也似乎相关(IDE 抱怨)。

使用这些导入时:

import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebSettings;
import android.webkit.WebView;

import androidx.annotation.NonNull;

import androidx.webkit.SafeBrowsingResponseCompat;
import androidx.webkit.WebResourceErrorCompat;
import androidx.webkit.WebViewClientCompat;
import androidx.webkit.WebViewFeature;
import androidx.webkit.WebViewCompat;

使用WebViewClientCompat 的工作原理如下:

private WebView mWebView;

...
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

    this.mWebView.setWebViewClient(new WebViewClientCompat(){

        @Override
        public void onPageCommitVisible(@NonNull WebView view, @NonNull String url) {
            super.onPageCommitVisible(view, url);
        }

        @Override
        public void onReceivedError(@NonNull WebView view, @NonNull WebResourceRequest request, @NonNull WebResourceErrorCompat error) {
            super.onReceivedError(view, request, error);
        }

        @Override
        public void onReceivedHttpError(@NonNull WebView view, @NonNull WebResourceRequest request, @NonNull WebResourceResponse errorResponse) {
            super.onReceivedHttpError(view, request, errorResponse);
        }

        @Override
        public void onSafeBrowsingHit(@NonNull WebView view, @NonNull WebResourceRequest request, int threatType, @NonNull SafeBrowsingResponseCompat callback) {
            super.onSafeBrowsingHit(view, request, threatType, callback);
        }

        @Override
        public boolean shouldOverrideUrlLoading(@NonNull WebView view, @NonNull WebResourceRequest request) {
            return super.shouldOverrideUrlLoading(view, request);
        }
    });
}

实现interface WebViewCompat.VisualStateCallback 的工作方式类似:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && WebViewFeature.isFeatureSupported(WebViewFeature.VISUAL_STATE_CALLBACK)) {
    final int mVisualStateCallbackId = 500;
    WebViewCompat.postVisualStateCallback(mWebView, mVisualStateCallbackId, new WebViewCompat.VisualStateCallback() {
        @Override
        public void onComplete(long requestId) {
            if (requestId == mVisualStateCallbackId) {
                mWebView.setVisibility(View.VISIBLE);
            }
        }
    });
}

【讨论】:

  • 你知道这样做的好处吗?
  • @TomTasche 如所述:it relies on an update-able APK 而不是框架的 WebKit 实现。名称Compat 几乎总是意味着它是一个抽象......所以interface 方法看起来非常相似,但使用的引擎可能是另一个。
  • WebViewFeature.isFeatureSupported() 也提示不同的实现...
  • 很好地移植到 WebViewCompat 似乎是在浪费时间。
猜你喜欢
  • 2015-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-20
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多