5

私は、ボタンクリックに基づいていくつかのビュー要素の可視性を切り替える、Androidアプリケーションを構築しています。私はfindViewById()を使用するのではなく、データバインディングでそれをアーカイブしようとしていますが、変数が変更されたときに今まで見つかったすべてのソリューションはレイアウトを更新しません。Androidデータバインディングでレイアウト要素の表示を動的に切り替えます。

これまで私がこれまで持っていたことは次のとおりです。 (私は問題に焦点を当て、コードを簡素化しました)

Activicy.java

public class RecipeActivity extends AppCompatActivity { 
private Recipe recipe; 
private ActivityRecipeBinding binding; 
private RecipeBinderHelper rbhelper = new RecipeBinderHelper(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Intent intent = getIntent(); 
    recipe = intent.getParcelableExtra("recipe"); 
    binding = DataBindingUtil.setContentView(this, R.layout.activity_recipe); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    toolbar.setTitle(recipe.getName()); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    binding.recipeContent.setRecipe(recipe); 
    binding.recipeContent.setHelper(rbhelper); 

    binding.Button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      //HERE I CHANGE THE VALUE OF THE VARIBLE 
      rbhelper.setPresentationViewVisible(false); 
      binding.notifyChange(); 
     } 
    }); 
} 
} 

ヘルパークラス

public class RecipeBinderHelper{ 
private Boolean presentationElementsVisible; 
private Boolean timerElementsVisible; 

public RecipeBinderHelper(){ 
    this.presentationElementsVisible = true; 
    this.timerElementsVisible = false; 
} 
public void setPresentationViewVisible(boolean presentationElementsVisible) { 
    this.presentationElementsVisible = presentationElementsVisible; 
} 
public Boolean getPresentationElementsVisible() { 
    return presentationElementsVisible; 
} 
//getters and setters for private Boolean timerElementsVisible; 
} 

レイアウト

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 
<data> 
    <import type="android.view.View"/> 
    <variable 
     name="helper" 
     type="com.myapps.recipeApp.RecipeBinderHelper"/> 
    <variable 
     name="recipe" 
     type="com.myapps.recipeApp.Recipe"/> 
</data> 
<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    tools:context="com.myapp.recipeApp.RecipeActivity" 
    tools:showIn="@layout/activity_recipe"> 
    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/r_source" 
     android:textStyle="bold" 
     android:text="@{recipe.source}" 
     android:visibility="@{helper.presentationElementsVisible ? View.VISIBLE : View.GONE}" /> 
<!-- More TextViews here --> 
<!-- Button is located in parret layout --> 
</RelativeLayout> 
</layout> 

答えて

3

は、私は非常に読むことをお勧めしますジョージ・マウントのposts about Android data-bindingは非常に便利です。


the documentationで説明したように、私はBaseObservableとしてヘルパークラスを拡張し、問題を解決します。

ヘルパークラス

public class RecipeBinderHelper{ 
    private Boolean presentationElementsVisible; 
    private Boolean timerElementsVisible; 

    public RecipeBinderHelper(){ 
     this.presentationElementsVisible = true; 
     this.timerElementsVisible = false; 
    } 
    public void setPresentationViewVisible(boolean presentationElementsVisible) { 
     this.presentationElementsVisible = presentationElementsVisible; 
     //Notifying change in the setter. 
     notifyPropertyChanged(BR.presentationElementsVisible); 
    } 
    //assigning Bindable annotation to the getter 
    @Bindable 
    public Boolean getPresentationElementsVisible() { 
     return presentationElementsVisible; 
    } 
    //getters and setters for private Boolean timerElementsVisible; 
} 

活性のbinding.notifyChange();は必要ではなく、除去することができます。

ボタンをクリックすると、アプリケーションは必要に応じてTextViewを削除します。


一つ特有のものは、Androidのスタジオ(2.1.2が、Ubuntuは)私にCannot resolve symbol 'BR'警告を与えるが、アプリがコンパイルされ、期待通りに動作することです。

関連する問題