使用数据绑定将数据传递到 <include> 布局
Pass data to <include> layout using Databinding
我今天一直在搜索这个问题,只找到了关于这个问题的一些不清楚的答案。
我在一个表单中有多个 TextView 和 EditText,它们都是由我的主题自定义的,我想每次都重复使用相同的包含布局,但它的参数就像 TextView 中的文本一样或在 EditText 中提示。
我现在的form.xml:
<LinearLayout android: orientation="horizontal">
<TextView android:text="Username"/>
<EditText android:id="edittext_username"
android:hint="Enter username..."
android:inputType="text"/>
</LinearLayout>
<LinearLayout android: orientation="horizontal">
<TextView android:text="Password"/>
<EditText android:id="edittext_password"
android:hint="Enter password..."
android:inputType="password"/>
</LinearLayout>
... other fields ...
我主要想要什么form.xml:
<LinearLayout android:orientation="vertical" ...>
<include layout="form_edittext"
app:textview_text="@{`Username`}"
app:edittext_hint="@{`Enter username...`}"
... other parameters ...
/>
<include layout="form_edittext"
app:textview_text="@{`Password`}"
app:edittext_hint="@{`Enter password...`}"
... other parameters ...
/>
</LinearLayout>
还有 form_edittext.xml:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="textview_text" type="java.lang.String"/>
<variable name="edittext_id" type="java.lang.String"/>
<variable name="edittext_inputType" type="java.lang.String"/>
<variable name="edittext_hint" type="java.lang.String"/>
</data>
<TextView android:text="@{textview_text}"/>
<EditText android:id="@{edittext_id}"
android:hint="@{edittext_hint}"
android:inputType="@{edittext_inputType}"/>
</layout>
我还是个初学者,不知道这是否可行。
在这个 post 上,那个人回答说他使用了数据绑定(就像我展示的例子一样)
(您可能会看到第一个答案)。
但是,使用这种方法给我的错误是 XML 无法识别像 "textview_text" 这样的标识符(我通过 @{...} 访问的变量。如果你有其他解决方案如果你分享它们,我将不胜感激。干杯!
更新 iCantC 的回答:(但文本视图的文本和提示仍然为空)。
主要布局:
<?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"
xmlns:tools="http://schemas.android.com/tools">
...
<include layout="@layout/activity_login_layout_input"
android:id="@+id/activity_login_layout_input_emailAddress"
app:textviewt="@{@string/email}" //the string is "Email Address"
app:edittexth="@{@string/emailhint}" /> //the string is "Your email address..."
...
</layout>
包含的布局:
<layout>
<data>
<variable
name="textviewt"
type="String"/>
<variable
name="edittexth"
type="String"/>
</data>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:showDividers="middle">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{textviewt}"
android:textColor="@color/c1"
android:textSize="12sp"/>
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingEnd="26dp">
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/edittext"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_gravity="center|start"
android:layout_marginStart="26dp"
android:background="@drawable/activity_login_background"
android:hint="@{edittexth}"
android:padding="6dp"
android:textAlignment="center"
android:textColor="@color/c2"
android:textColorHint="@color/grey"
android:textSize="14sp"/>
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_gravity="start"
android:adjustViewBounds="true"
android:src="@drawable/activity_login_edittext_drawable" />
</FrameLayout>
</LinearLayout>
</layout>
看来你想包含一个公共布局,然后将动态参数从主布局传递给包含的布局,步骤如下,
步骤 1:在您的项目中启用数据绑定
//In the build.gradle file in the app module, add this
android {
...
dataBinding {
enabled = true
}
}
第 2 步: 创建您的 common_layout_included.xml
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="username"
type="String"/>
</data>
<LinearLayout
..
>
<TextView
android:id="@+id/tv_username"
android:text="@{username}"/>
</LinearLayout>
</layout>
第 3 步: 在您的 main_layout.xml
中包含 common_layout_included.xml
<?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
..
>
<include
android:id="@+id/includedLayout"
layout="@layout/common_layout_included"
app:username="@{@string/username}" // here we pass any String
/>
</LinearLayout>
</layout>
第 4 步:确保使用 DataBinding 方式扩充布局
//In the onCreate of your Activity
val binding = DataBindingUtil.setContentView(this,R.layout.main_layout)
就是这样,您可以开始了。如果仍然出现一些错误,请执行 File -> Invalidate Caches/Restart
最后一件事,我看到您正在动态地将 id 分配给视图 android:id="@{edittext_id}"
,根据我的所有经验,我从未真正遇到过我会被激励这样做的用例。我什至不知道这是否可能,即使可能我也怀疑这是一个好习惯。
我今天一直在搜索这个问题,只找到了关于这个问题的一些不清楚的答案。
我在一个表单中有多个 TextView 和 EditText,它们都是由我的主题自定义的,我想每次都重复使用相同的包含布局,但它的参数就像 TextView 中的文本一样或在 EditText 中提示。
我现在的form.xml:
<LinearLayout android: orientation="horizontal">
<TextView android:text="Username"/>
<EditText android:id="edittext_username"
android:hint="Enter username..."
android:inputType="text"/>
</LinearLayout>
<LinearLayout android: orientation="horizontal">
<TextView android:text="Password"/>
<EditText android:id="edittext_password"
android:hint="Enter password..."
android:inputType="password"/>
</LinearLayout>
... other fields ...
我主要想要什么form.xml:
<LinearLayout android:orientation="vertical" ...>
<include layout="form_edittext"
app:textview_text="@{`Username`}"
app:edittext_hint="@{`Enter username...`}"
... other parameters ...
/>
<include layout="form_edittext"
app:textview_text="@{`Password`}"
app:edittext_hint="@{`Enter password...`}"
... other parameters ...
/>
</LinearLayout>
还有 form_edittext.xml:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="textview_text" type="java.lang.String"/>
<variable name="edittext_id" type="java.lang.String"/>
<variable name="edittext_inputType" type="java.lang.String"/>
<variable name="edittext_hint" type="java.lang.String"/>
</data>
<TextView android:text="@{textview_text}"/>
<EditText android:id="@{edittext_id}"
android:hint="@{edittext_hint}"
android:inputType="@{edittext_inputType}"/>
</layout>
我还是个初学者,不知道这是否可行。
在这个 post 上,那个人回答说他使用了数据绑定(就像我展示的例子一样)
但是,使用这种方法给我的错误是 XML 无法识别像 "textview_text" 这样的标识符(我通过 @{...} 访问的变量。如果你有其他解决方案如果你分享它们,我将不胜感激。干杯!
更新 iCantC 的回答:(但文本视图的文本和提示仍然为空)。 主要布局:
<?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"
xmlns:tools="http://schemas.android.com/tools">
...
<include layout="@layout/activity_login_layout_input"
android:id="@+id/activity_login_layout_input_emailAddress"
app:textviewt="@{@string/email}" //the string is "Email Address"
app:edittexth="@{@string/emailhint}" /> //the string is "Your email address..."
...
</layout>
包含的布局:
<layout>
<data>
<variable
name="textviewt"
type="String"/>
<variable
name="edittexth"
type="String"/>
</data>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:showDividers="middle">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{textviewt}"
android:textColor="@color/c1"
android:textSize="12sp"/>
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingEnd="26dp">
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/edittext"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_gravity="center|start"
android:layout_marginStart="26dp"
android:background="@drawable/activity_login_background"
android:hint="@{edittexth}"
android:padding="6dp"
android:textAlignment="center"
android:textColor="@color/c2"
android:textColorHint="@color/grey"
android:textSize="14sp"/>
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_gravity="start"
android:adjustViewBounds="true"
android:src="@drawable/activity_login_edittext_drawable" />
</FrameLayout>
</LinearLayout>
</layout>
看来你想包含一个公共布局,然后将动态参数从主布局传递给包含的布局,步骤如下,
步骤 1:在您的项目中启用数据绑定
//In the build.gradle file in the app module, add this
android {
...
dataBinding {
enabled = true
}
}
第 2 步: 创建您的 common_layout_included.xml
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="username"
type="String"/>
</data>
<LinearLayout
..
>
<TextView
android:id="@+id/tv_username"
android:text="@{username}"/>
</LinearLayout>
</layout>
第 3 步: 在您的 main_layout.xml
common_layout_included.xml
<?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
..
>
<include
android:id="@+id/includedLayout"
layout="@layout/common_layout_included"
app:username="@{@string/username}" // here we pass any String
/>
</LinearLayout>
</layout>
第 4 步:确保使用 DataBinding 方式扩充布局
//In the onCreate of your Activity
val binding = DataBindingUtil.setContentView(this,R.layout.main_layout)
就是这样,您可以开始了。如果仍然出现一些错误,请执行 File -> Invalidate Caches/Restart
最后一件事,我看到您正在动态地将 id 分配给视图 android:id="@{edittext_id}"
,根据我的所有经验,我从未真正遇到过我会被激励这样做的用例。我什至不知道这是否可能,即使可能我也怀疑这是一个好习惯。