2016-11-06 3 views
0

Es fällt mir schwer zu verstehen, wie die Ansicht mithilfe der Datenbindung aktualisiert wird. Ich habe ein einfaches Beispiel, mit dem ich experimentiere, bei dem ein Kippschalter eine Schaltfläche in der Ansicht erscheinen/verschwinden lässt.So aktualisieren Sie die Sichtbarkeit eines Layoutelements mit der Datenbindung

erwartetes Verhalten:
Das Toggle Umschaltfläche sollte die "Schlüssel hinzufügen" auf/von (d VISIBLE oder GONE).

tatsächliches Verhalten:
Der „Schlüssel hinzufügen“, um die Sichtbarkeit aktualisiert wird nicht. Es wird nur einmal beim Laden des Layouts gesetzt. Hier

ist die Layout-Datei:

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools"> 

    <data> 

     <variable 
      name="mainActivity" 
      type="tanager.sandbox.MainActivity" /> 

     <variable 
      name="businessLogic" 
      type="tanager.sandbox.BusinessLogic" /> 
    </data> 

    <RelativeLayout 
     android:id="@+id/activity_main" 
     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" 
     tools:context="tanager.sandbox.MainActivity"> 

     <LinearLayout 
      android:id="@+id/linear_layout" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="horizontal"> 

      <Button 
       android:id="@+id/add_key_button" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:visibility="@{businessLogic.getVisible()}" 
       android:text="@string/add_key" /> 

     </LinearLayout> 

     <ToggleButton 
      android:id="@+id/toggleButton" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignBottom="@id/linear_layout" 
      android:layout_weight="3" 
      android:text="ToggleButton" 
      android:onClick="@{() -> mainActivity.click()}"/> 
    </RelativeLayout> 
</layout> 

Wenn die Toggle-Taste gedrückt wird, es ruft eine Methode auf der Haupttätigkeit, die einen Wert in der Business-Logik schaltet. Ich erwarte, dass die add_key_button ihre Sichtbarkeit automatisch aktualisiert, wenn die Umschalttaste gedrückt wird. Hier ist die MainActivity:

public class MainActivity extends AppCompatActivity { 
    private BusinessLogic _businessLogic; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     _businessLogic = new BusinessLogic(); 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ActivityMainBinding binding = DataBindingUtil.setContentView(this, 
       R.layout.activity_main); 

     binding.setMainActivity(this); 
     binding.setBusinessLogic(_businessLogic); 
    } 

    public void click() { 
     _businessLogic.toggleVisibility(); 
    } 
} 

Und hier ist die Business-Logik-Klasse:

public class BusinessLogic extends BaseObservable { 

    private boolean visible; 
    public BusinessLogic(){ 
     visible = true; 
    } 

    public void toggleVisibility(){ 
     visible = !visible; 
     notifyPropertyChanged(BR.visible); 
    } 

    @Bindable 
    public int getVisible(){ 
     return visible? View.VISIBLE:View.GONE; 
    } 
} 

Antwort

0

ich etwas Code Refactoring, das funktioniert

public void click() { 
    _businessLogic.toggleVisibility(binding.toggleButton.isChecked()); 
} 

Die Businesslogic Methode sieht nun wie

public class BusinessLogic extends BaseObservable { 

private boolean isToggleOn; 

public BusinessLogic() { 
    isToggleOn = false; 
} 

public void toggleVisibility(boolean toggleOn) { 
    isToggleOn = toggleOn; 
    notifyPropertyChanged(BR.toggleOn); 
} 

@Bindable 
public boolean getToggleOn() { 
    return isToggleOn; 
} 

Dann im Layout, können Sie die Sichtbarkeit auf der getToggleOn Methode der Klasse Businesslogik basiert gesetzt

<Button 
      android:id="@+id/add_key_button" 
      android:layout_width="match_parent" 
      android:visibility="@{businessLogic.toggleOn ? View.VISIBLE : View.GONE}" 
      android:layout_height="wrap_content" 
      android:text="Add key" /> 

Denken Sie daran, die Ansichts-Klasse in Ihrem Layout

<data> 

    <import type="android.view.View"/> 

    <variable 
     name="mainActivity" 
     type="stackoverflow.MainActivity" /> 
zu importieren
Verwandte Themen