[将数据传递到 使用数据绑定的布局

问题描述 投票:0回答:1

我今天进行了很多搜索,但只发现了有关此问题的一些不清楚的答案。

我在一个表单中有多个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>

我仍然是初学者,我不知道这是否可能。在这篇文章中,那个家伙回答说他使用了数据绑定(如我所示的示例)How to Re-using Layouts with <include/> with parameters?(您可能会看到第一个答案)。

但是,使用这种方法给我的XML错误是无法识别诸如“ textview_text”之类的标识符(我正在通过@ {......访问的变量。如果您有其他解决方案,请与我分享。干杯!

iCantC答案的更新:(但textview的文本和提示保持为空)。主要布局:

<?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>
android xml data-binding parameters include
1个回答
1
投票

似乎您想包含一个通用布局,然后将动态参数从主布局传递到包含的布局,这是步骤,

假设您已经在项目上启用 Databinding

步骤1:创建您的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>

第2步:common_layout_included.xml中包括main_layout.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>

就这样,你很好。如果仍然出现一些错误,请执行File -> Invalidate Caches/Restart

[最后一件事,我看到您正在为视图的动态android:id="@{edittext_id}"分配ID,在我的所有经验中,我从未真正遇到过激励我这样做的用例。我什至不知道这是否可能,甚至我怀疑这是一个好习惯。

© www.soinside.com 2019 - 2024. All rights reserved.