Webview和ProgressBar的2路数据绑定

时间:2017-06-01 07:47:24

标签: android data-binding webview 2-way-object-databinding

我正在尝试为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>

1 个答案:

答案 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>