【问题标题】:Android Two-Way Data Binding in NavigationDrawerNavigationDrawer中的Android双向数据绑定
【发布时间】:2016-06-16 10:49:08
【问题描述】:

我正在使用数据绑定库实现新应用。不幸的是,我在导航抽屉中找不到任何双向绑定的示例(使用 android.support.v4.widget.DrawerLayout)。抽屉布局包含一些可变文本和两个切换开关(使用 android.support.v7.widget.SwitchCompat)。

在这种情况下使用数据绑定有意义吗?关于如何实现这一点的任何想法?有没有人有/找到这种实现的一些示例代码?

【问题讨论】:

  • 这有什么更新吗??
  • 你可以参考我的answer或者blog看看如何实现。

标签: android navigation-drawer android-databinding


【解决方案1】:

在这种情况下使用数据绑定有意义吗?

这真的取决于架构。数据绑定通常与 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);
    }
}

【讨论】:

  • 这可以在片段中完成吗?我正在片段中加载导航抽屉,所以您能否也根据片段更新您的答案?
【解决方案2】:

我还想将数据绑定用于抽屉布局,这些是我的发现。我使用androidx.drawerlayout.widget.DrawerLayout。我假设现在你也使用它。

现在我有两种情况:

  • 如果您想绑定到您的抽屉布局的标题,您可以这样做。我发现最简单的方法是自己在 MainActivity 中填充标题布局并像往常一样设置数据绑定,然后将其设置为抽屉布局中的标题。

  • 但是,如果您想对抽屉中的项目进行数据绑定,这些项目会从菜单中膨胀,并且数据绑定不支持菜单。请参阅this question (至少在我的情况下我使用菜单,你真的没有提供太多信息)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 2019-12-24
    • 2020-11-26
    • 2022-11-22
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    相关资源
    最近更新 更多