2016-11-06 3 views
0

データバインディングを使用してビューを更新する方法を理解していません。私はトグルスイッチがボタンを表示/非表示にする実験を行っています。レイアウト要素のデータバインディングでの可視性を更新する方法

期待される動作:
トグルボタンが(すなわちVISIBLEまたはGONE)のオン/「キーの追加」ボタンを切り替える必要があります。

実際の動作:
[キーの追加]ボタンの表示は更新されません。レイアウトがロードされるときに一度だけ設定されます。ここで

は、レイアウトファイルです:トグルボタンが押された場合

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

、それはビジネスロジックに値を切り替え主な活動、上のメソッドを呼び出します。私はadd_key_buttonがトグルボタンが押されたときに自動的に可視性を更新することを期待しています。 、私は少しあなたのコードをリファクタリング

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

答えて

0

これは、ビジネスロジックの方法は、今

のように見えます

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

作品:

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

そしてここでは、ビジネス・ロジック・クラスである:ここではMainActivityです

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

は、次にレイアウトで、あなたは

<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" /> 

があなたのレイアウトでビュークラスをインポートすることを忘れないでくださいビジネスロジッククラスのgetToggleOn法に基づく可視性を設定することができます

<data> 

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

    <variable 
     name="mainActivity" 
     type="stackoverflow.MainActivity" /> 
関連する問題