如何将当前的Android布局段提取到自己的自定义控件中?

时间:2013-09-21 01:29:29

标签: android android-layout user-interface custom-controls abstraction

好的,我有一个完整的布局;但是,我对产生的长xml文件并不满意。我有一个简短的xml大纲和设计师视图版本。我想知道如何将每组相似的组件抽象到他们自己的自定义控件中。

例如,在下面的图片中,我强调了一个我想抽象出来的控件。而不是它是LinearLayout里面有TextView的{​​{1}},而是设置了自己的属性和属性。我想通过<package-name.individual_song_item android:layout...> ... </>引用它。我所要做的就是通过顶级组件中的属性设置第一个TextView的文本和第二个文本。

如何做到这一点?我已经完成了布局并完成了,但我不喜欢没有抽象出来。

所以我正在寻找的预期结果是(如果你看图像的右侧。图像下方只有一个LinearLayout,其余的将是{{ 1}})

我试图仅使用组件的子集创建一个新的布局xml,但是在将它组合回来时我无法使其工作。

enter image description here


OLD WAY

<package-name.individual_song_item>

可能的建议方式

<LinearLayout >

    <ImageView />

    <LinearLayout >

        <LinearLayout >

            <TextView />
            <TextView />

        </LinearLayout>

        <LinearLayout >

            <TextView />
            <TextView />

        </LinearLayout>

        <LinearLayout >

            <TextView />
            <TextView />

        </LinearLayout>

        ....

    </LinearLayout>

</LinearLayout>

1 个答案:

答案 0 :(得分:0)

创建自定义布局,例如

public class IndividualSongItem extends LinearLayout {

    private String mSong;
    private String mSongName;

    public IndividualSongItem(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    public IndividualSongItem(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.IndividualSongItem);

        try {
            // Read in your custom layout's attributes, 
            // for example song and songName text attributes
            CharSequence s = a.getString(R.styleable.IndividualSongItem_song);
            if (s != null) {
                setSong(s.toString());
            }

            s = a.getString(R.styleable.IndividualSongItem_songName);
            if (s != null) {
                setSongName(s.toString());
            }
        } finally {
            a.recycle();
        }

    }
....etc

您还需要为新布局类创建属性XML。 有关如何在查看ApiDemos中的LabelView示例后如何执行操作的完整示例。

也很好地解释了 here