1

我的活动中有一个半屏自定义视图和一个 TextView。

<com.sted.test.mainView
    android:id="@+id/mainView" android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

<TextView android:id="@+id/tvScore" android:layout_height="wrap_content" android:layout_width="wrap_content"
    android:layout_alignParentLeft="true" android:layout_alignParentBottom="true" />

单击自定义视图后,如何在我的活动中更新 TextView?

目前我在我的自定义视图中有这段代码,但它在该部分onTouchEvent()中遇到了 NullPointerException 。setText()我不应该在我的自定义视图中更新 TextView 吗?

TextView tvScore = (TextView) findViewById(R.id.tvScore);
tvScore.setText("Updated!");
4

1 回答 1

4

您无法在自定义视图的代码中“看到” TextView tvScore。findViewById()从您调用它的视图开始查找层次结构中的视图,或者如果您正在调用,则从层次结构根目录查找Activity.findViewById()(当然这仅在 之后有效setContentView())。

如果您的自定义视图是一个复合视图,比如包含一些 TextView 的线性布局,那么findViewById()在其中使用是有意义的。

解决方案是找到例如文本视图,然后以某种方式(如某种方法)onCreate()将其传递给自定义视图。set..()

编辑

如果在您的自定义视图中,您有类似的内容:

public class CustomView extends View {
    ...
    TextView tvToUpdate;
    public void setTvToUpdate(TextView tv) {
        tvToUpdate = tv;
    }
    ...
}

您可以执行以下操作:

protected void onCreate(Bundle bundle) {
    ...
    CustomView cv = (CustomView) findViewById(R.id.customview);
    TextView tv = (TextView) findViewById(R.id.tv);
    cv.setTvToUpdate(tv);
    ...
}

这样从那时起,您就可以在自定义视图的代码中引用 textview。这就像某种设置。

于 2011-02-19T11:04:48.003 回答