android - 片段包含绑定不会设置变量
问题描述
我有一个带有 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
视图中没有我想要的显示。我究竟做错了什么?是因为它是一个片段吗?
解决方案
您必须调用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
但不使用this
但requireActivity
当然作为第二个参数您传递正确的 XML 布局。在片段中可以调用这个函数并返回值:
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return DataBindingUtil.setContentView<FragmentBlankBinding>(
requireActivity(),
R.layout.fragment_blank
).root
}
推荐阅读
- python - 删除长度大于 1 的数字
- python - python-uno 如何使用管道操作 libreoffice-calc?
- javascript - 为什么我不能使用 vanilla JavaScript 重新获取我网站的数据?
- java - session.getAttribute 为 Chrome 浏览器返回 null。(小服务程序)
- python - 有没有办法踢/禁止 discord.py 中的每个人?
- python - Python - 使用 OpenWeatherMap API 问题
- java - java socket连接到代理而不是实际的服务器
- html - HTML 标题是否有长度限制?(h1、h2 等)
- rust - 在为 Diesel 结构实现 get 和 delete 特征时溢出评估要求 `_: std::marker::Sized`
- three.js - 如何为从 glb 文件加载的模型添加颜色或纹理?