导航 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个问题:
您没有为 nav_header_map.xml
使用数据绑定(您没有带有视图模型数据的 <layout>
标记)
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());
}
你好,我有一个 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个问题:
您没有为
nav_header_map.xml
使用数据绑定(您没有带有视图模型数据的<layout>
标记)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());
}