2016-07-07 18 views
5

Ich baue eine Android-App, bei der ich die Sichtbarkeit einiger Ansichtselemente basierend auf einem Knopfklick umschalten möchte. Ich versuche, es mit Datenbindung statt findViewById() zu archivieren, aber alle Lösungen, die ich bis jetzt gefunden habe, aktualisiert das Layout nicht, wenn die Variable geändert wird.Dynamische Umschaltung der Sichtbarkeit von Layoutelementen mit Android-Datenbindung.

Hier ist was ich bisher habe. (Ich habe den Code vereinfacht, auf das Problem zu konzentrieren)

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(); 
     } 
    }); 
} 
} 

Helper Klasse

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; 
} 

Layout-

<?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> 

Antwort

3

Ich empfehle sehr zu lesen George Mount posts about Android data-binding, sie sind sehr nützlich.


Zur Lösung des Problems ich die Helfer Klasse als BaseObservable in the documentation wie beschrieben erweitert.

Helper Klasse

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; 
} 

Die binding.notifyChange(); in der Aktivität nicht notwendig ist und entfernt werden kann.

Die App entfernt jetzt die TextView wie gewünscht, wenn auf die Schaltfläche geklickt wird.


Eine eigenartige Sache ist, dass Android Studio (2.1.2, Ubuntu) gibt mir eine Cannot resolve symbol 'BR' Warnung, aber die App kompiliert und läuft wie erwartet.