Android - 自定义复合组件中的视图不会膨胀(findByView返回null)

时间:2010-06-12 10:30:12

标签: android relativelayout

我在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>

任何人都可以发现什么吗?感谢。

1 个答案:

答案 0 :(得分:6)

我对你的两个XML布局感到困惑。

第二个是你说你使用小部件的地方。因此,我假设名为ClearableCaptionedButton的类在包de.pockettaxi.widget中。

我进一步假设你的第一个布局中显示的ButtonImageView总是应该在ClearableCaptionButton中,而不是{{1}的重新使用者提供的东西}}

如果这些假设都是正确的,那么你有两个问题。

  • 首先,你没有使用第一个 在我能看到的任何地方布局。
  • 第二,第一个 layout引用了可能不存在的ClearableCaptionButton

我会将myapp.widget.ClearableCaptionedButton元素替换为myapp.widget.ClearableCaptionedButton元素,然后在构造函数或<merge> onFinishInflate()中夸大该布局。

我的一本书中的

Here is a sample project显示了使用以这种方式工作的自定义小部件。

另外,鉴于你的包裹名称,我希望它是一个非常大的口袋或一个非常小的出租车......: - )