2016-07-07 60 views
5

Sto costruendo un'app per Android, in cui desidero attivare la visibilità di alcuni elementi della vista in base a un clic del pulsante. Sto cercando di archiviarlo con il data-binding invece di usare findViewById(), ma tutte le soluzioni che ho trovato fino ad ora non aggiornano il layout, quando la variabile viene modificata.Attiva o disattiva la visibilità degli elementi del layout con l'associazione dati di Android.

Ecco quello che ho finora. (Ho semplificato il codice, per concentrarsi sul problema)

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

classe Helper

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> 

risposta

3

mi raccomando di leggere George Mount's posts about Android data-binding, sono molto utili.


per risolvere il problema ho esteso la classe di supporto come un BaseObservable come descritto nella the documentation.

classe Helper

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

Il binding.notifyChange(); in attività non è necessario e può essere rimosso.

L'app rimuove il TextView come desiderato, quando si fa clic sul pulsante.


Una cosa particolare è che Android Studio (2.1.2, Ubuntu) mi dà un avvertimento Cannot resolve symbol 'BR', ma l'applicazione compila e funziona come previsto.