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>