Android-创建新的视图属性并在XML复合视图组件中传递给其子级-布局中的数据绑定

时间:2018-08-03 09:16:36

标签: android xml inheritance layout parameters

完整答案:

1。在 app / build.gradle 中启用数据绑定:

dataBinding {
   enabled true
}

2。使用 DataBindingUtil 设置内容视图

java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    DataBindingUtil.setContentView(this, R.layout.activity_engineering_mode_main);
}

3。子项布局

您将看到我定义了2个新属性

values / bools.xml

<variable
    name="textTitle"
    type="String" />

<variable
    name="buttonVisibility"
    type="boolean" />

通过 textTitle ,您可以使用 @ string / string_name

来使用资源中的任何字符串

使用 buttonVisibility ,您必须定义 bool 资源类型,并使用 @ bool / bool_name

布局/item_engineering_list_row.xml

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

<data>

    <import type="android.view.View" />

    <variable
        name="textTitle"
        type="String" />

    <variable
        name="buttonVisibility"
        type="boolean" />
</data>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="@dimen/engineer_actionbar_height"
    android:background="@color/engineer_background_color"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/engineer_txtName"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_marginLeft="@dimen/engineer_text_margin"
        android:layout_weight="1"
        android:gravity="center_vertical"
        android:text="@{textTitle}"
        android:textColor="@color/engineer_text_color"
        android:textSize="@dimen/engineer_title_font_size" />

    <Button
        android:id="@+id/engineer_btnNext"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginRight="@dimen/engineer_text_margin"
        android:text="BACK"
        android:visibility="@{buttonVisibility ? View.VISIBLE : View.GONE, default=gone}" />

</LinearLayout>
</layout>

4。布尔资源文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="item_button_visibility_default">false</bool>
    <bool name="item_button_visibility_on">true</bool>
    <bool name="item_button_visibility_off">false</bool>
</resources>

5。父级布局,其中包括一些子级,并将值传递给新属性

<?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"
    android:orientation="vertical">

    <include
        android:id="@+id/includedLayout0"
        layout="@layout/item_engineering_list_row"
        app:buttonVisibility="@{@bool/item_button_visibility_on}"
        app:textTitle="@{@string/app_name}" />
    <include
        android:id="@+id/includedLayout1"
        layout="@layout/item_engineering_list_row"
        app:buttonVisibility="@{@bool/item_button_visibility_default}"
        app:textTitle="@{@string/app_name}" />
</LinearLayout>
</layout>

原始问题:

我是android的新手,并且在QT中使用QML已有一段时间了。

我想知道如何通过在复合视图组件中以XML形式应用参数来简化布局。

我在xml中有一个自定义布局项,并希望将某些属性从父级传递到其子级,并且我还想用新值初始化父级的属性以自定义其子级。

我的概念如下:

item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    !!!! how to declare a new attribute here !!!
    | like this:
    | textTitle="New Title"      // default value for child
    | buttonVisibility="visible" // default value for child
    ">

    <TextView
        android:id="@+id/engineer_txtTitle"
        android:text= textTitle <--- use parent's />

    <Button
        android:id="@+id/engineer_btnBack"
        android:visibility= buttonVisibility  <== use parent's />

</LinearLayout>

点击此处查看图片:base Item

main.xml

<LinearLayout>
    <include
        android:id="@+id/item1"
        layout="@layout/item" 
        textTitle= "FIRST"
        // buttonVisibility not set here, use default as visible
        />

    <include
        android:id="@+id/item2"
        layout="@layout/item"
        textTitle= "SECOND"
        buttonVisibility = "gone" // dont show button 
        />
 </LinearLayout>

点击此处查看图片:apply with param

2 个答案:

答案 0 :(得分:0)

您可以使用Architecture组件的 Data Binding 。这是您的需求示例。

最近我 answered 与此相关的问题。 清除答案

该示例显示了传递值到<include

我有一个共同的观点 layout_common.xml ,我想将String传递到包含的布局。我将创建一个类型为String的变量。将String引用到您的TextView。例如,我创建了passedText

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

    <data>
        // declare fields
        <variable
            name="passedText"
            type="String"/>
    </data>

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{passedText}"/> //set field to your view.

</layout>

现在,您可以将passedText字段传递到您的<include标签。

activity_main.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
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >

        <include
            android:id="@+id/includedLayout"
            layout="@layout/layout_common"
            app:passedText="@{@string/app_name}" // here we pass any String 
            />

    </LinearLayout>
</layout>

请注意,两个布局(父布局和包含布局)都应为binding layout,并用<layout包裹

答案 1 :(得分:0)

感谢@Khemraj在Android中显示关键字“数据绑定”:)

我已经找到了答案。它包括Khemraj的答案和一些添加到Values资源的小代码。 我将其发布在我的问题中,以供其他人轻松查找。