0

好的,我已经建立了一个完整的布局;但是,我对生成的长 xml 文件并不满意。我在下面有一个简短的 xml 大纲和设计器视图。我想知道如何将每组相似的组件抽象到他们自己的自定义控件中。

例如,在下图中,我突出显示了一个我想抽象出来的控件。而不是一个LinearLayout带有 2TextView的内部有自己的属性和属性集。我想通过<package-name.individual_song_item android:layout...> ... </>. 我所要做的就是TextView通过顶级组件中的属性设置第一个文本和第二个文本。

如何才能做到这一点?我已经完成并完成了布局,但我不喜欢没有任何东西被抽象掉。

所以我正在寻找的预期结果是(如果你看图像的右侧。图像下方只有一个LinearLayout,其余的是<package-name.individual_song_item>

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

在此处输入图像描述


老路

<LinearLayout >

    <ImageView />

    <LinearLayout >

        <LinearLayout >

            <TextView />
            <TextView />

        </LinearLayout>

        <LinearLayout >

            <TextView />
            <TextView />

        </LinearLayout>

        <LinearLayout >

            <TextView />
            <TextView />

        </LinearLayout>

        ....

    </LinearLayout>

</LinearLayout>

可能的建议方式

<LinearLayout >

    <ImageView />

    <LinearLayout >

        <com.example.individual_song_item />
        <com.example.individual_song_item />
        <com.example.individual_song_item />

        ....

        <com.example.individual_song_item  <!-- example (possible!?!?) -->
            ....
            app:label="Group"
            app:value="Group Name" />

    </LinearLayout>

</LinearLayout>
4

1 回答 1

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

于 2013-09-21T04:30:19.260 回答