0

Я реализую новое приложение, используя библиотеку привязки данных. К сожалению, я не могу найти примеры двусторонней привязки в навигационном ящике (используя android.support.v4.widget.DrawerLayout). В макете ящика содержится некоторый изменяемый текст и два переключателя (с помощью android.support.v7.widget.SwitchCompat).Двусторонняя привязка данных в NavigationDrawer

Имеет ли смысл использовать привязку данных в этом сценарии? Любые идеи о том, как это реализовать? Кто-нибудь есть/нашел какой-то примерный код для такого рода реализации?

+1

любое обновление по этому вопросу? – vjamit

+0

Вы можете ссылаться на мой [ответ] (http://stackoverflow.com/questions/33962548/how-to-data-bind-to-a-header/38846146#38846146) или [блог] (http: // tonyz93 .blogspot.hk/2016/08/learn-data-binding-of-android.html), чтобы узнать, как его реализовать. – Tony

ответ

2

Имеет ли смысл использовать привязку данных в этом сценарии?

Это действительно зависит от архитектуры. Связывание данных часто используется вместе с архитектурой MVVM (см. this example, если вы не знакомы с ним). Но в любом случае, если вы предпочитаете писать свой код последовательно, вам не захочется смешивать привязку данных с обычным findViewById() и вы хотите, чтобы привязка данных повсюду.

Реализация не сильно отличается от любого другого случая привязки данных. Макет (названный R.layout.act_main в данном примере) должен иметь двухстороннюю привязку:

<layout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools"> 

<data> 

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

    <variable 
     name="VM" 
     type="your.package.name.MainActivityVM"/> 
</data> 

<android.support.v4.widget.DrawerLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true"> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <!-- Put your main activity content here--> 

    </RelativeLayout> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:orientation="vertical"> 

     <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="@{VM.mutableText}" 
       tools:text="Sample text" /> 

     <android.support.v7.widget.SwitchCompat 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:checked="@={VM.optionEnabled}" 
      android:text="Option"/> 

    </LinearLayout> 
</android.support.v4.widget.DrawerLayout> 
</layout> 

Посмотреть модель должна иметь соответствующий поглотитель:

public class MainActivityVM { 

    private ObservableField<String> mMutableText = new ObservableField<>(); 
    private ObservableBoolean mOptionEnabled = new ObservableBoolean(false); 

    public MainActivityVM() { 
     //Your stuff here. E.g., you can add a listener to track the switch toggle: 
     mOptionEnabled.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() { 
      @Override 
      public void onPropertyChanged(Observable sender, int propertyId) { 
       if (mOptionEnabled.get()) { 
        //Do some stuff if the user turned the switch on 
       } 
      } 
     }); 
     mMutableText.set("Hello world!"); 
    } 

    public ObservableField<String> getMutableText() { 
     return mMutableText; 
    } 

    public void setOptionEnabled(ObservableBoolean optionEnabled) { 
     this.mOptionEnabled = optionEnabled; 
    } 

    public ObservableBoolean isOptionEnabled() { 
     return mOptionEnabled; 
    } 
} 

Посмотреть модель должна быть связана в своей деятельности, как это:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     ActMainBinding binding = DataBindingUtil.setContentView(this, R.layout.act_main); 

     MainActivityVM viewModel = new MainActivityVM(); 
     binding.setVM(viewModel); 
    } 
} 
Смежные вопросы