2016-07-07 23 views
5

Buduję aplikację na Androida, w której chcę przełączać widoczność niektórych elementów widoku na podstawie kliknięcia przycisku. Próbuję zarchiwizować go za pomocą wiązania danych zamiast używać findViewById(), ale wszystkie rozwiązania, które znalazłem do tej pory, nie aktualizują układu, gdy zmienna jest zmieniana.Dynamicznie przełączaj widoczność elementów układu z powiązaniem danych Androida.

Oto, co mam do tej pory. (Mam uproszczony kod, aby skupić się na problemie)

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

klasa Pomocnik

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

Układ

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

Odpowiedz

3

Gorąco polecam czytać George Mount's posts about Android data-binding, są bardzo przydatne.


Aby rozwiązać ten problem, że przedłużony klasę pomocnika jako BaseObservable jak opisano w the documentation.

klasa pomocnicza

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(); na działanie nie jest konieczna i może być usunięta.

Aplikacja teraz usuwa TextView zgodnie z potrzebami, po kliknięciu przycisku.


Jedną rzeczą jest to, że szczególna Android Studio (2.1.2, Ubuntu) daje mi Cannot resolve symbol 'BR' ostrzeżenie, ale aplikacja kompiluje i działa zgodnie z oczekiwaniami.