Android 如何将数据绑定到标头?
我有一个主要活动,在操作栏中有一个侧导航抽屉,在default_screen.xml中指定如下(注意,为了简洁起见省略了很多代码):Android 如何将数据绑定到标头?,android,android-activity,binding,Android,Android Activity,Binding,我有一个主要活动,在操作栏中有一个侧导航抽屉,在default_screen.xml中指定如下(注意,为了简洁起见省略了很多代码): <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_h
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="190dp"
android:background="@drawable/honeycomb"
android:orientation="vertical"
>
<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="@layout/header"
app:menu="@menu/drawer"
/>
如何将数据绑定到标头?我尝试了一些失败的事情,主要是:
DefaultScreenBinding binding = DataBindingUtil.setContentView(R.layout.default_screen);
这是行不通的。我怎样才能做到这一点?不确定这是否是最好的方法,但这正是适合我的场景的方法 我为
NavigationView
(扩展了类)创建了一个自定义视图,然后将DataBindingUtil.inflate
作为自定义视图构造函数的一部分,我使用该构造函数设置数据绑定变量,并添加该变量,然后使用NavigationView.addHeaderView
将该视图添加为标题。当然,这意味着在xml中,我必须用自定义视图替换NavigationView
,而不是在自定义视图中指定app:headerLayout属性。请参见下面的自定义视图示例(请注意,我使用Dagger2注入数据绑定变量)
我的解决办法如下:
<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/navigation"
app:menu="@menu/activity_drawer_drawer">
<include
layout="@layout/nav_header_drawer"
bind:thisDevice="@{thisDevice}" />
可以找到工作示例
如果我不清楚,请通知我。有效的解决方案如下,在创建主活动时添加标题视图:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
NavHeaderMainBinding _bind = DataBindingUtil.inflate(getLayoutInflater(), R.layout.nav_header_main, binding
.navView, false);
binding.navView.addHeaderView(_bind.getRoot());
_bind.setUser(Session.getUserProfile());
}
似乎没有为NavigationView创建数据绑定的直接方法,因此我必须以黑客的方式实现它:
首先,为了使用bind,我们不能使用directheaderlayout并将其替换为包含的布局
<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_drawer"
app:menu="@menu/drawer">
<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:menu="@menu/drawer">
<include layout="@layout/nav_header_drawer"
bind:thisDevice="@{thisDevice}" />
</android.support.design.widget.NavigationView>
布局文件在这里。
可以在这里找到工作示例
参考:如果任何视图是父视图的子视图,则可以将其与父视图绑定。如下所示:导航视图标题是导航视图的子级,因此要将导航视图标题与导航视图绑定,需要如下所示
主屏幕的默认屏幕绑定:
DefaultScreenBinding binding = DataBindingUtil.setContentView(R.layout.default_screen);
对于包括装订在内的页眉布局,应:
HeaderBinding headerBinding = HeaderBinding.bind(binding.navigationView.getHeaderView(0));
binding.navigationView.getHeaderView(0)
将提供要绑定的导航视图的标题视图
现在,可以使用headerBinding进行标题布局参照。希望您能轻松理解并获得帮助。重要的一行是binding.navView.addHeaderView(_bind.getRoot());从xml中删除app:headerLayout=“@layout/nav_header_main”,如上所述以编程方式添加这是最好的方法,我已经实现了这种方法,并且它的工作完美无瑕。
<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_drawer"
app:menu="@menu/drawer">
<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:menu="@menu/drawer">
<include layout="@layout/nav_header_drawer"
bind:thisDevice="@{thisDevice}" />
</android.support.design.widget.NavigationView>
<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/navigation"
app:menu="@menu/activity_drawer_drawer">
<include
layout="@layout/nav_header_drawer"
bind:thisDevice="@{thisDevice}" />
</android.support.design.widget.NavigationView>
ActivityDrawerBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_drawer);
binding.setThisDevice(Device.now);
DefaultScreenBinding binding = DataBindingUtil.setContentView(R.layout.default_screen);
HeaderBinding headerBinding = HeaderBinding.bind(binding.navigationView.getHeaderView(0));