我想构建可重用的小部件。它应该是标准元素的序数组合。什么是最好的方法。下面是我目前使用的代码示例,但可能会有更优雅的东西。此外,下面的示例在运行时完美运行,但Eclipse中的可视化编辑器抛出异常(这对我来说不是问题)。有没有推荐的创建复合材料的方法?我应该使用片段吗?
public class MyComposite extends LinearLayout {
private ImageView m_a1;
private ImageView m_a2;
private ImageView m_w1;
private ImageView m_w2;
private ImageView m_w3;
private ImageView m_w4;
public CallBackSlider(final Context context) {
this(context, null);
}
public CallBackSlider(final Context context, final AttributeSet attrs) {
super(context, attrs);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.my_composite, this, true);
setupViewItems();
}
private void setupViewItems() {
m_a1 = (ImageView) findViewById(R.id.A1Img);
m_w1 = (ImageView) findViewById(R.id.Wave1Img);
m_w2 = (ImageView) findViewById(R.id.Wave2Img);
m_w3 = (ImageView) findViewById(R.id.Wave3Img);
m_w4 = (ImageView) findViewById(R.id.Wave4Img);
m_a2 = (ImageView) findViewById(R.id.A2Img);
resetView();
}
private void resetView() {
m_w1.setAlpha(0);
m_w2.setAlpha(0);
m_w3.setAlpha(0);
m_w4.setAlpha(0);
}
}
布局xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/MyComposite"
... >
<ImageView
android:id="@+id/A1Img"
android:src="@drawable/a1"
...
/>
<ImageView
android:id="@+id/Wave1Img"
...
android:src="@drawable/wave1" />
<ImageView
android:id="@+id/Wave2Img"
...
android:src="@drawable/wave2" />
<ImageView
android:id="@+id/Wave3Img"
...
android:src="@drawable/wave3" />
<ImageView
android:id="@+id/Wave4Img"
...
android:src="@drawable/wave4" />
<ImageView
android:id="@+id/EarImg"
...
android:src="@drawable/a2" />
</LinearLayout>
然后你可以在其他布局中使用它:
...
<your.package.MyComposite
android:id="@+id/mc1"
...
/>
...
使用java代码以及MyComposite类的实例。
答案 0 :(得分:1)
在您的示例中,我认为您需要合并的小部件。
如果您需要更改窗口小部件的标准行为,请自定义它,然后使用自定义窗口小部件。
但是如果您需要具有标准行为的视图组,则将它们合并就足够了。
some_activity.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical">
// some views
<include layout="@layout/view_part"/>
// probably more views
</LinearLayout>
view_part.xml:
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView
android:id="@+id/A1Img"
android:src="@drawable/a1"
...
/>
<ImageView
android:id="@+id/Wave1Img"
...
android:src="@drawable/wave1" />
<ImageView
android:id="@+id/Wave2Img"
...
android:src="@drawable/wave2" />
<ImageView
android:id="@+id/Wave3Img"
...
android:src="@drawable/wave3" />
<ImageView
android:id="@+id/Wave4Img"
...
android:src="@drawable/wave4" />
<ImageView
android:id="@+id/EarImg"
...
android:src="@drawable/a2" />
</merge>
答案 1 :(得分:1)
最近引入了嵌套片段(在SDK 4.1或4.2和compat库中)。但我倾向于认为应该使用这些嵌套片段来封装更复杂的UI片段,而不仅仅是像你这样的简单小部件。
自定义小部件的常用方法是覆盖onFinishInflate方法。您有that blog的教程。
以下是相应的代码:
public class TwoTextWidget extends LinearLayout {
private TextView textOne;
private TextView textTwo;
public TwoTextWidget(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
((Activity)getContext()).getLayoutInflater().inflate(R.layout.two_text_component, this);
setupViewItems();
}
private void setupViewItems() {
textOne = (TextView) findViewById(R.id.text_one);
textTwo = (TextView) findViewById(R.id.text_two);
}
public void setTextOne(String text) {
textOne.setText(text);
}
public void setTextTwo(String text) {
textTwo.setText(text);
}
}
您可以使用自定义属性允许更多自定义窗口小部件。查看that other blog。