我正在尝试为WebView和Progressbar实现双向数据绑定。
最初ProgressBar将继续出现,一旦webview完成加载,进度条应该是GONE。
但我无法创建那个绑定
我已经为webview创建了绑定适配器来加载url,并且还设置了WebViewClient以检查页面加载是否已完成但无法更新进度条的可见性
//////////////发布
@BindingAdapter({"app:webUrl"})
public void configureWebView(WebView iWebView, String iUrl) {
iWebView.getSettings().setJavaScriptEnabled(true);
iWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
// code to set visibility of progress bar
}
});
iWebView.loadUrl(iUrl);
}
////////////////////布局
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<import type="android.view.View" />
<variable
name="newsUrl"
type="com.example.bindingdemo.data.model.Post" />
</data>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/news_web_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:webUrl="@{newsUrl.url}" />
<ProgressBar
android:id="@+id/news_prog_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="@{**<WhatConditionToWrite>** ? View.GONE: View.Visible}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
</layout>
答案 0 :(得分:6)
在BindingAdapter
@BindingAdapter({ "setWebViewClient" })
public static void setWebViewClient(WebView view, WebViewClient client) {
view.setWebViewClient(client);
}
@BindingAdapter({ "loadUrl" })
public static void loadUrl(WebView view, String url) {
view.loadUrl(url);
}
在ViewModel
public class YourObjectModel extends BaseObservable {
private class Client extends WebViewClient {
@Override
public void onReceivedError(WebView view, WebResourceRequest request,
WebResourceError error) {
super.onReceivedError(view, request, error);
setHideProgress(true);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
setHideProgress(true);
}
}
public WebViewClient getWebViewClient() {
return new Client();
}
@Bindable
public boolean isHideProgress() {
return hideProgress;
}
private void setHideProgress(boolean hideProgress) {
this.hideProgress = hideProgress;
notifyPropertyChanged(BR.hideProgress);
}
}
XML
<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="viewModel"
type="YourObjectModel"
/>
</data>
<WebView
...
app:loadUrl="@{viewModel.url}"
app:setWebViewClient="@{viewModel.webViewClient}" />
<ProgressBar
...
android:visibility="@{viewModel.hideProgress ? View.GONE : View.VISIBLE}" />
</layout>