我正在构建一个Android应用程序,我想根据按钮点击切换一些视图元素的可见性.我试图用数据绑定而不是使用findViewById()来存档它,但是直到现在我发现的所有解决方案都不会在更改变量时更新布局.
这是我到目前为止所拥有的. (我简化了代码,专注于问题)
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;
}
布局
最佳答案
我强烈推荐阅读George Mount的posts about Android data-binding,它们非常实用.
为解决这个问题,我将助手类扩展为BaseObservable,如the documentation所述.
助手班
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;
}
Activity中的binding.notifyChange();不是必需的,可以删除.
现在,当单击按钮时,应用程序会根据需要删除TextView.
一个奇怪的事情是Android Studio(2.1.2,Ubuntu)给了我一个无法解决符号’BR’警告,但应用程序编译并按预期运行.