除了DataBinding之外,还有其他方法可以在Android Studio中多次使用具有不同属性的相同布局吗?

时间:2017-10-27 20:27:04

标签: android android-layout layout include

  

我有以下名为sample_layout.xml的布局,我想   多次使用它,但每次都有一些更改

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_marginBottom="20dp">

    <RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="110dp"
    android:background="@drawable/full_panel_blue"
    android:padding="10dp"
    android:layout_marginBottom="20dp">

    <ImageView
        android:layout_width="120dp"
        android:layout_height="120dp"
        android:src="@mipmap/first_icon" />

    <LinearLayout
        android:layout_width="350dp"
        android:layout_height="fill_parent"
        android:layout_alignParentRight="true"
        android:gravity="end"
        android:orientation="vertical">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="@color/my_white"
            android:text="4000000"
            android:textSize="50sp"
            android:gravity="end"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="end"
            android:textColor="@color/my_white"
            android:textSize="20sp"
            android:text="Sample text" />

    </LinearLayout>

    </RelativeLayout>

</LinearLayout>
     

下面是多次包含的布局

     

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <include layout="@layout/sample_layout"/>
    <include layout="@layout/sample_layout"/>
    <include layout="@layout/sample_layout"/>

</LinearLayout>
     

     

所以,我想第一次包括它,但第二次   而不是@drawable/full_blue_panel,我想使用另一个   drawable(@drawable/red_w_transparency)。而且对于   ImageView我想第二次使用另一个src作为图标,并且   另一个第三次。也许TextView中有不同的文字   对于任何先前创建的属性,每次等等。一世   已经尝试过使用DataBinding,但我认为不是   完全适合这个。还有其他办法吗?

1 个答案:

答案 0 :(得分:1)

通常,我通过创建自定义View子类来解决此类问题。这里介绍了基础知识:https://developer.android.com/guide/topics/ui/custom-components.html#compound

简短版本是您定义一些影响要更改的部分的自定义属性,然后创建一个View子类实现,读取这些属性以修改其视图层次结构。

在您发布的示例中,您有以下相关要点:

  • 根是LinearLayout
  • 您想要更改RelativeLayout背景
  • 您想要更改ImageView src
  • 您想要更改TextView文字

您可以在attrs.xml

中创建这些属性
<declare-styleable name="MyCompoundComponent">
    <attr name="background"/>
    <attr name="imageSrc"/>
    <attr name="primaryText"/>
</declare-styleable>

接下来,您将创建视图类。由于您的原始布局的根目录是LinearLayout,我们将从中得出:

public class MyCompoundComponent extends LinearLayout {

    public MyCompoundComponent(Context context, AttributeSet attrs) {
        super(context, attrs);

        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyCompoundComponent);
        // read your attributes
        a.recycle();

        inflate(context, R.layout.my_compound_component, this);

        // find your views, use your attributes to modify them
    }
}

当然,你需要一个布局。您可以使用上面发布的那个,除非您将根元素更改为<merge>,因为您在LinearLayout内对其进行了充气。

完成所有这些后,您可以像在任何其他视图中一样在其他布局中使用此视图:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <com.example.stackoverflow.MyCompoundComponent
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:background="@color/blue"
        app:imageSrc="@drawable/image1"
        app:primaryText="@string/text1"/>

    <com.example.stackoverflow.MyCompoundComponent
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:background="@color/red"
        app:imageSrc="@drawable/image2"
        app:primaryText="@string/text2"/>

</LinearLayout>