我有以下名为
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,但我认为不是 完全适合这个。还有其他办法吗?
答案 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>