Android包含可参数化的布局

时间:2017-01-22 07:44:19

标签: android android-layout

我讨厌重复相同的代码。我有一项活动:

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

第二个:

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

包含的布局包含:

....
<ImageView
    android:id="@+id/star1"
    android:layout_width="22dp"
    android:layout_height="22dp"
    android:src="@drawable/ic_star_off"
    tools:ignore="ContentDescription" />
....

第二种布局使用36dp图片。我可以以某种方式避免有两个文件?我还没有找到如何在包含的布局中传递一些参数。 https://developer.android.com/training/improving-layouts/reusing-layouts.html

结论 - 不可能

2 个答案:

答案 0 :(得分:2)

您可以在include标记上添加尺寸:

<include layout="@layout/tmpl_stars"
    android:layout_width="22dp"
    android:layout_height="22dp" />

<ImageView
    android:id="@+id/star1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@drawable/ic_star_off"
    tools:ignore="ContentDescription" />
  

您还可以通过在标记中指定它们来覆盖所包含布局的根视图的所有布局参数(任何android:layout_ *属性)。例如:

答案 1 :(得分:1)

您可以创建自定义视图并在布局中使用它。

〔实施例:

custom_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imgview" />
</LinearLayout>

CustomView.java

public class CustomView extends LinearLayout {

    int width = -1;
    int height = -1;
    ImageView imageview;

    public CustomView(Context context) {
        super(context);
        inflate(context, R.layout.custom_layout, this)
        initViews();
    }

    @SuppressWarnings("ResourceType")
    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
        inflate(context, R.layout.custom_layout, this);
        int[] attributes = {
                android.R.attr.width,     //=====> 0
                android.R.attr.height     //=====> 1
        };
        TypedArray attrSet = context.obtainStyledAttributes(attrs, attributes);
        width = attrSet.getDimension(0, -1);  //android.R.attr.width,
        height = attrSet.getDimension(1, -1); //android.R.attr.height
        attrSet.recycle();
        initViews();
    }

    public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        inflate(context, R.layout.custom_layout, this);
        initViews();
    }

    public void initViews(){
        imageview = findViewById(R.id.imgview);
        if(width > -1){
            imageview.setWidth(width);
        }
        if(height > -1){
            imageview.setHeight(height);
        }
    }
}

当你想要使用它时:

activity.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <CustomView
        android:layout_width="33dp"
        android:layout_height="33dp" />
</LinearLayout>

我只是想向您展示基础结构,您应该为您的案例自定义此代码。