我正在使用数据绑定库实现新的应用程序。不幸的是,我无法在导航抽屉中找到任何双向绑定的示例(使用android.support.v4.widget.DrawerLayout)。抽屉布局包含一些可变文本和两个切换swtiches(使用android.support.v7.widget.SwitchCompat)。
在这种情况下使用数据绑定是否有意义?有关如何实现这一点的任何想法?有没有人为这种实现找到/找到一些示例代码?
答案 0 :(得分: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>
查看模型应该有相应的getter:
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);
}
}
答案 1 :(得分:0)
我也想对抽屉布局使用数据绑定,这是我的发现。我使用androidx.drawerlayout.widget.DrawerLayout
。我想现在您也使用此功能。
现在我有两种情况:
如果要绑定到抽屉布局的标题,可以执行此操作。我找到的最简单的方法是在MainActivity中自己膨胀标题布局,并像通常一样设置数据绑定,然后将其设置在抽屉布局中作为标题。
但是,如果要对抽屉中的项目进行数据绑定,则这些内容会从菜单中放大,并且数据绑定不支持菜单。至少在我使用菜单的情况下,请参见this question (,您确实没有提供太多信息)