如何实际重用UI布局元素?

时间:2019-07-03 13:07:16

标签: android android-layout

为了确保相同类型的每个UI元素看起来都相同,我试图找到一种以适当方式重用布局元素的方法。例如,我的主要CTA按钮始终具有圆形的背景,字体,文本大小,间距,颜色等。

我可以像这样使用{CascadeType.PERSIST, CascadeType.MERGE}标签:

ls = [[0]*5]*5
print(ls)
import numpy as np
x=np.random.randint(0,5)
y=np.random.randint(0,5)

我的<include/>是:

<include
    layout="@layout/include_primary_button"
    android:id="@+id/activity_home_cta" />

使用include_primary_button.xml标记仅限制要覆盖的布局属性。因此,例如设置每个使用的按钮的文本,我需要在活动/片段中<?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <Button tools:ignore="MissingPrefix" fontPath="fonts/Roboto.ttf" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/button" android:text="STUB!" android:textAllCaps="true" android:textColor="@color/text" android:textSize="@dimen/text" /> </merge> 并以编程方式设置文本。这让我很烦,但是可以克服。但是随后从活动中检索按钮(例如<include/>),则该按钮为空。这里缺少什么?

还有没有更简单的方法来重用元素?真的感觉很麻烦。

3 个答案:

答案 0 :(得分:4)

您可以制作样式。例如

<style name="CustomButton" parent="@style/Widget.AppCompat.Button">
        <item name="android:minHeight">40dp</item>
        <item name="android:textAppearance">@style/ButtonText</item>
        <item name="android:textColor">@color/btn_primary</item>
        <item name="android:background">@drawable/btn_primary</item>
        <item name="android:paddingEnd">@dimen/btn_padding</item>
        <item name="android:paddingStart">@dimen/btn_padding</item>
    </style>

 <style name="ButtonText">
        <item name="android:textAllCaps">true</item>
        <item name="android:fontFamily">@font/arial</item>
        <item name="android:textSize">@dimen/text_button</item>
    </style>

然后添加

<Button
            style="@style/CustomButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/btn" />

如果您想拥有一个自定义视图,则始终可以创建一个新类,该类将从您想要的任何内容(例如,Button,View)扩展而来,并具有自己的xml,然后您可以像这样添加它。 (这是tutorial。interwebz上有很多)

<CustomView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>

答案 1 :(得分:1)

使用样式。对于像这样的简单用例,您说自定义样式会有所帮助。

答案 2 :(得分:0)

您要了解的一件事是:

  

<include>标签不是真实视图,因此findByView将找不到   它。 @id属性(以及您在   include标签)应用于包含布局的根标签   代替。 (source)

这意味着您的id属性已转移到<merge>标记中,这不是真实视图,因此为什么找不到它。如果您删除了<merge>标签,它应该可以工作。

此外,除了在布局文件中创建该按钮并将其包括在内之外,您还可以创建自定义View,然后在布局文件中使用该按钮。您可以了解有关创建View here的更多信息。