2016-11-29 3 views
3

データバインディングを使用して簡単な表示/非表示を実現しようとしています。私はAPIコールを持っているので、APIコールが行われている間にプログレスバーを1つ表示する必要があります。いったん応答が出たら、この進捗状況を却下してデータを表示する必要があります。データバインディングを使用して、プログレスバーの可視性を動的に変更しようとしました。しかし、何も起こりません。 Progresbarの可視性は、バインディング変数に基づいて初めて設定されます。バインディング変数を更新すると動的に更新されません。アンドロイドデータバインディングを使用してビューの視認性を動的に変更する方法

次は、同じ

活動のための私のサンプルコードです:

public class MainActivity extends AppCompatActivity { 

private static final String TAG = MainActivity.class.getSimpleName(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); 
    final ViewModel viewmodel = new ViewModel(); 
    binding.setViewmodel(viewmodel); 

    findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      loadData(viewmodel); 
     } 
    }); 
} 

private void loadData(final ViewModel viewmodel) { 
    viewmodel.setLoading(true); 
    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      Log.d(TAG, "Loading finished"); 
      viewmodel.setLoading(false); 
     } 
    }, 2000); 
} 
} 

のViewModel:アプリのビルドで

import android.databinding.BaseObservable; 
import android.databinding.Bindable; 

public class ViewModel extends BaseObservable { 

private boolean isLoading; 
private String data; 


@Bindable 
public String getData() { 
    return data; 
} 

public void setData(String data) { 
    this.data = data; 
} 

@Bindable 
public boolean isLoading() { 
    return isLoading; 
} 

public void setLoading(boolean loading) { 
    isLoading = loading; 
} 
} 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools"> 

<data> 
    <import type="android.view.View"/> 
    <variable name="viewmodel" type="com.test.databindnig.ViewModel"/> 
</data> 
<LinearLayout 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center_horizontal" 
    android:orientation="vertical" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.test.databindnig.MainActivity"> 

    <ProgressBar 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:visibility="@{viewmodel.isLoading ? View.VISIBLE : View.GONE}"/> 
    <TextView 
     android:id="@+id/text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@{viewmodel.data}" 
     android:visibility="@{viewmodel.isLoading ? View.GONE : View.VISIBLE}"/> 


    <Button 
     android:id="@+id/btn" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:text="Load data"/> 
</LinearLayout> 
</layout> 

も.gradle

dataBinding { 
    enabled = true 
} 

ここでは何が欠けていますか?それはなぜ機能しないのですか?事前のおかげで..あなたがあなたのプロパティの値が変更されたことを通知する必要があり

答えて

5

、BR.propertyName

notifyPropertyChanged(BR.loading); 
を使用して、この

public void setLoading(boolean loading) { 
    isLoading = loading; 
    notifyPropertyChanged(BR._all); 
} 

またはあなただけの単一の変数のためにそれを通知する場合を試してみてください

+1

ありがとう!魅力のように働く – Drd

関連する問題