我在XML中创建了一个自定义组件,包含一个叠加了imageview的按钮:
<myapp.widget.ClearableCaptionedButton
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id="@+id/ccbutton_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical|left"
android:textAppearance="?android:attr/textAppearanceMedium"
android:background="@android:drawable/edit_text"/>
<ImageView
android:id="@+id/ccbutton_clear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="5dip"
android:layout_alignRight="@id/ccbutton_button"
android:layout_alignTop="@id/ccbutton_button"
android:layout_alignBottom="@id/ccbutton_button"/>
</myapp.widget.ClearableCaptionedButton>
java源代码的摘录:
public class ClearableCaptionedButton extends RelativeLayout implements OnClickListener {
...
public ClearableCaptionedButton(Context context, AttributeSet attrs) {
super(context, attrs);
// some stuff that works fine
}
..
protected void onFinishInflate() {
super.onFinishInflate();
mButton = (Button) findViewById(R.id.ccbutton_button);
mClear = (ImageView) findViewById(R.id.ccbutton_clear);
mButton.setText(""); // error here: mButton == null
}
我的问题与this类似。当我尝试在自定义化合物中查找视图时,findViewById返回null。但是,正如你所看到的,我已经添加了super(context,attrs);到构造函数。 我在xml布局中直接使用自定义组件,如下所示:
<LinearLayout>
<!-- some stuff -->
<myapp.widget.ClearableCaptionedButton
android:layout_width="fill_parent"
android:layout_height="wrap_content"
app:caption="to"/>
</LinearLayout>
任何人都可以发现什么吗?感谢。
答案 0 :(得分:6)
我对你的两个XML布局感到困惑。
第二个是你说你使用小部件的地方。因此,我假设名为ClearableCaptionedButton
的类在包de.pockettaxi.widget
中。
我进一步假设你的第一个布局中显示的Button
和ImageView
总是应该在ClearableCaptionButton
中,而不是{{1}的重新使用者提供的东西}}
如果这些假设都是正确的,那么你有两个问题。
ClearableCaptionButton
。我会将myapp.widget.ClearableCaptionedButton
元素替换为myapp.widget.ClearableCaptionedButton
元素,然后在构造函数或<merge>
onFinishInflate()
中夸大该布局。
Here is a sample project显示了使用以这种方式工作的自定义小部件。
另外,鉴于你的包裹名称,我希望它是一个非常大的口袋或一个非常小的出租车......: - )