Случайно я обнаружил, что есть библиотека поддержки для WebView, которая является частью AndroidX: androidx.webkit: webkit: 1.0.0
Однако я не смог найти образец кода о том, как его использовать, и JavaDoc тоже не очень помогает: https://developer.android.com/reference/androidx/webkit/package-summary
Предполагается, что это будет использоваться разработчиками или это внутренняя библиотека?
Нашел видео с Android Dev Summit 2018, объясняющее новый WebViewCompat внутри Android X: youtube.com/watch?v=HGZYtDZhOEQ Но оно не содержит полезных примеров кода: :(
Эта библиотека является абстракцией androidx для WebKit (поскольку она полагается на APK с возможностью обновления).
Сам WebViewCompat.java говорит «не создавать этого экземпляра» (а также тег XML неизвестен, поэтому нужно использовать android.webkit.WebView); но класс WebViewCompat имеет несколько доступных методов public static; Также WebView кажется актуальным (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);
}
});
}
реализация interfaceWebViewCompat.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, кажется, был пустой тратой времени.
Я тоже не знаю, но думаю, что он обеспечивает согласованную реализацию javascript на всех платформах.