2017-06-01 92 views
1

我想實現2路數據綁定的WebView和Progressbar。2路數據綁定的Webview和ProgressBar

最初ProgressBar將繼續出現,一旦webview完成加載,進度條應該是GONE。

但我不能夠創建結合

我已經創建綁定適配器的WebView加載網址,並設置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

在你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> 
+0

我沒有使用任何視圖模型。只有Model類持有數據和簡單的數據綁定。我們能做到嗎? – Napolean

+0

@Napolean這個模型是ViewModel ^^ –

+0

謝謝Phan。有效。我只是改變了 hideProgress如下訪問器和增變器 public ObservableBoolean hideProgress = new ObservableBoolean(); – Napolean