【问题标题】:fragment Include binding wont set variable片段包含绑定不会设置变量
【发布时间】:2020-09-17 18:55:00
【问题描述】:

我有一个带有 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 显示。我究竟做错了什么?是因为它是一个片段吗?

【问题讨论】:

    标签: android xml android-layout binding include


    【解决方案1】:

    您必须在包含布局的布局文件中调用DataBindingUtil.setContentView&lt;ActivityMainBinding&gt;(this, R.layout.activity_main)。示例:

    included_layout:

    <?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>
    

    main_activity:

    <?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 中调用相同的函数,但不是this,而是requireActivity,当然作为第二个参数您传递正确的XML 布局。在片段中可以调用这个函数并返回值:

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

    【讨论】:

    • 非常感谢您的回答!还有一个问题^^“我如何将attachToRoot设置为false?现在它崩溃了,因为“孩子已经有了父母”
    • 不客气。很难说为什么您在没有看到代码的情况下收到此错误:/ 您可以尝试查看 this answer。如果它没有帮助您可以尝试提出一个新问题并包含您的 .kt.java 文件,因为我认为此错误在这些文件中,而不是在布局中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多