Имеет ли смысл использовать привязку данных в этом сценарии?
Это действительно зависит от архитектуры. Связывание данных часто используется вместе с архитектурой 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);
}
}
любое обновление по этому вопросу? – vjamit
Вы можете ссылаться на мой [ответ] (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