首页 > 解决方案 > 片段包含绑定不会设置变量

问题描述

我有一个带有 xml 文件的片段。xml 文件尝试包含其他 xml 文件。当我尝试使用绑定来设置包含的 xml 的不同变量时,没有任何反应。这是我的代码:

片段 xml(短版):

 <include
                    android:id="@+id/include2"
                    layout="@layout/sende_option_box"
                    android:layout_width="0dp"
                    android:layout_height="147dp"
                    android:layout_marginStart="16dp"
                    android:layout_marginTop="32dp"
                    android:layout_marginEnd="16dp"
                    app:title='@{"foo"}'
                    app:numbervalue='@{"foo"}'
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintHorizontal_bias="0.0"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/textView25" />

包含的xml:

<layout>
<data>
    <variable name="title" type="String" />
    <variable name="numbervalue" type="String" />
</data>

<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="147dp"
    android:background="@drawable/parcel_list_item_borderbox"
    android:elevation="5dp">

    <TextView
        android:id="@+id/textView26"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="21dp"
        android:layout_marginTop="33dp"
        android:text="@{title}"
        android:textAppearance="@style/TextAppearanceBoldBody22"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="Opptil 10kg"/>

    <TextView
        android:id="@+id/textView27"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="21dp"
        android:text="Norgespakken"
        android:textAppearance="@style/TextAppearanceBody15"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView26" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="21dp"
        android:layout_marginBottom="15dp"
        android:background="@color/postenVeryLightPink"
        android:padding="6dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent">

        <TextView
            android:id="@+id/textView28"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{numbervalue}"
            android:textAppearance="@style/TextAppearanceBoldBody15"
            android:textColor="@color/postenPrimaryDark"
            tools:layout_editor_absoluteX="50dp"
            tools:layout_editor_absoluteY="17dp"
            tools:text="Fra 149,-"/>
    </LinearLayout>

    <ImageView
        android:id="@+id/imageView6"
        android:layout_width="120dp"
        android:layout_height="120dp"
        android:layout_marginEnd="12dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/alert_message_borderbox_yellow" />
</androidx.constraintlayout.widget.ConstraintLayout>

构建运行,但foo视图中没有我想要的显示。我究竟做错了什么?是因为它是一个片段吗?

标签: androidxmlandroid-layoutbindinginclude

解决方案


您必须调用DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)包含布局的布局文件。例子:

包含布局:

<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    >

    <data>
        <variable
            name="myTitle"
            type="String"/>
    </data>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{myTitle}"/>

</layout>

主要活动:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <include
            layout="@layout/included_layout"
            app:myTitle="@{`Your Title`}" />

    </LinearLayout>
</layout>

主要活动:

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import com.myniprojects.bindingtest.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity()
{
    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
        DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main) // HERE You have to call this function
    }
}

如果您在片段中包含布局您调用相同的函数onCreateView但不使用thisrequireActivity当然作为第二个参数您传递正确的 XML 布局。在片段中可以调用这个函数并返回值:

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    return DataBindingUtil.setContentView<FragmentBlankBinding>(
        requireActivity(),
        R.layout.fragment_blank
    ).root
}

推荐阅读