Android绑定布局id

Android Binding layout id

我想使用 "new" 数据绑定库将页眉布局和菜单绑定到我的 NavigationView。

我这样试过:

<android.support.design.widget.NavigationView
    android:id="@+id/navigation_view"
    android:layout_height="match_parent"
    android:layout_width="wrap_content"
    android:layout_gravity="start"
    app:headerLayout="@{navigationViewModel.HeaderLayout}"
    app:menu="@{navigationViewModel.Menu}" />

我的视图模型是这样的:

public class NavigationViewModel extends BaseObservable {

    public @IdRes int getHeaderLayout(){
        return 0;
    }

    public @MenuRes int getMenu(){
        return 0;
    }

}

但是我得到了这个例外:

Error:(41, 33) Cannot find the setter for attribute 'app:headerLayout' with parameter type int.

我应该使用什么样的类型?

我曾经遇到过这个错误,但现在我使用 @BindingAdapter 修复了它。

@BindingAdapter(value = "app:headerLayout", requireAll = false)
public static void inflateHeaderLayout(NavigationView navigationView, @LayoutRes int layoutRes) {
    navigationView.inflateHeaderView(layoutRes);
}

剩下的就是你设置的数据码。

根据 this 介绍,他们将其称为 Automagic Attributes,而一些自定义属性数据绑定能够通过使用前缀 set(也许 :))找到它们的方法。例如,

<android.support.v4.widget.DrawerLayout
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  app:scrimColor="@{@color/scrim}"/>

然后没有错误因为

drawerLayout.setScrimColor(
  resources.getColor(R.color.scrim))

但是在app:headerLayout的情况下,NavigationView中没有setHeaderLayout()方法。所以我们需要为该属性创建一个绑定适配器。