NavigationDrawer

时间:2016-06-16 10:49:09

标签: android navigation-drawer android-navigation-drawer android-databinding

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

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

2 个答案:

答案 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 (,您确实没有提供太多信息)