导航 header 打印 @={loginViewModel.userId} 而不是数据,为什么?

The nav header print @={loginViewModel.userId} instead of the data, why?

你好,我有一个 Activity 抽屉式菜单,如下所示:

MapActivity.java

在这里设置数据绑定,就像在应用程序的其他活动中一样

public class MapActivity extends BaseActivity{
    private LoginViewModel loginViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMapBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_map);
        loginViewModel = ViewModelProviders.of(this).get(LoginViewModel.class);
        binding.setLoginViewModel(loginViewModel);
        binding.setLifecycleOwner(this);

activity_map.xml

这里是对 ViewModel 的引用,就像在这个应用的其他布局中一样。

?xml version="1.0" encoding="utf-8"?>
<layout>
    <data>

        <variable
            name="loginViewModel"
            type="com.myapp.login.LoginViewModel" />
    </data>
    <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        tools:openDrawer="start">

        <include
            layout="@layout/app_bar_map"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

        <android.support.design.widget.NavigationView
            android:id="@+id/nav_view"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:fitsSystemWindows="true"
            app:headerLayout="@layout/nav_header_map"
            app:menu="@menu/activity_map_drawer" />

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

nav_header_map.xml

并且这设置了对 LoginViewModel.userId

的引用
<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="@dimen/nav_header_height"
        android:background="@drawable/background_gradient"
        android:gravity="bottom"
        android:orientation="vertical"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:theme="@style/ThemeOverlay.AppCompat.Dark">


        <android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="bottom"
            android:orientation="horizontal"
            android:paddingLeft="@dimen/activity_horizontal_margin"
            android:paddingTop="@dimen/activity_vertical_margin"
            android:paddingRight="@dimen/activity_horizontal_margin"
            android:paddingBottom="@dimen/activity_vertical_margin"
            android:theme="@style/ThemeOverlay.AppCompat.Dark">

            <TextView
                android:id="@+id/textView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="16dp"
                android:layout_marginTop="16dp"
                android:layout_marginEnd="16dp"
                android:layout_marginBottom="19dp"
                android:paddingTop="@dimen/nav_header_vertical_spacing"
                android:textColor="@color/red"
                android:text="@={loginViewModel.userId}"
                android:textAppearance="@style/TextAppearance.AppCompat.Body1"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"/>

        </android.support.constraint.ConstraintLayout>

    </LinearLayout>

问题是,当在 nav_heade_map 中打开此 activity 时,打印“@={loginViewModel.userId}”而不是用户 ID。

如何解决出现 userId 的问题。

谢谢。

你的案例有2个问题:

  1. 您没有为 nav_header_map.xml 使用数据绑定(您没有带有视图模型数据的 <layout> 标记)

  2. NavigationView 不会通过数据绑定使您的 app:headerLayout 膨胀(它不知道如何传递数据等)

您可以尝试以编程方式获取视图,并使用适当的数据绑定设置添加您的 header 视图。类似的东西(这是伪代码 - 没试过):

nav_header_map.xml - 添加 <layout> 标签和 <data> 与您的 viewModel

MapActivity

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMapBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_map);
        loginViewModel = ViewModelProviders.of(this).get(LoginViewModel.class);
        binding.setLoginViewModel(loginViewModel);
        binding.setLifecycleOwner(this);

        NavHeaderMapBinding headerBinding = NavHeaderMapBinding.inflate(getLayoutInflater();
        headerBinding.setLoginViewModel(loginViewModel);  // this will add the proper data to the nav_header_map.xml

        // binding.navView is automatically generated since you have android:id="@+id/nav_view" in your xml
        binding.navView.addHeaderView(headerBinding.getRoot());
}