Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何将数据绑定到标头?_Android_Android Activity_Binding - Fatal编程技术网

Android 如何将数据绑定到标头?

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

我有一个主要活动,在操作栏中有一个侧导航抽屉,在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_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));