2017-06-01 16 views
1

WebViewとProgressbarの2ウェイデータバインディングを実装しようとしています。WebViewとProgressBarの2ウェイデータバインド

最初はProgressBarが引き続き表示され、webviewの読み込みが終了すると進捗バーはGONEになります。

は、しかし、私は

を結合することは、私が終了したページの読み込みをチェックするために、URLを読み込むために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

あなた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

であなたの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); } 

では、私はすべてのビューモデルを使用していません。データと簡単なデータバインディングを保持するModelクラス。それはできますか? – Napolean

+0

@NapoleanこのモデルはViewModelです^^ –

+0

ありがとうございます。出来た。私はちょうど変更しました hideProgressはアクセサとミューテータに従うようになります public ObservableBoolean hideProgress = new ObservableBoolean(); – Napolean

関連する問題