好的,我有一个完整的布局;但是,我对产生的长xml文件并不满意。我有一个简短的xml大纲和设计师视图版本。我想知道如何将每组相似的组件抽象到他们自己的自定义控件中。
例如,在下面的图片中,我强调了一个我想抽象出来的控件。而不是它是LinearLayout
里面有TextView
的{{1}},而是设置了自己的属性和属性。我想通过<package-name.individual_song_item
android:layout...> ... </>
引用它。我所要做的就是通过顶级组件中的属性设置第一个TextView
的文本和第二个文本。
如何做到这一点?我已经完成了布局并完成了,但我不喜欢没有抽象出来。
所以我正在寻找的预期结果是(如果你看图像的右侧。图像下方只有一个LinearLayout
,其余的将是{{ 1}})
我试图仅使用组件的子集创建一个新的布局xml,但是在将它组合回来时我无法使其工作。
OLD WAY
<package-name.individual_song_item>
可能的建议方式
<LinearLayout >
<ImageView />
<LinearLayout >
<LinearLayout >
<TextView />
<TextView />
</LinearLayout>
<LinearLayout >
<TextView />
<TextView />
</LinearLayout>
<LinearLayout >
<TextView />
<TextView />
</LinearLayout>
....
</LinearLayout>
</LinearLayout>
答案 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 。