android - 在自定义 View 中更新 TextView

标签 android textview android-custom-view

我的 Activity 中有一个半屏自定义 View 和一个 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" />

点击自定义 View 后,如何更新 Activity 中的 TextView?

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

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

最佳答案

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

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

解决方案是在 onCreate() 中找到 TextView ,然后以某种方式将其传递给自定义 View (例如某些 set..() 方法) .

编辑

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

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);
    ...
}

这样您就可以在自定义 View 的代码中引用 textview。这就像某种设置。

关于android - 在自定义 View 中更新 TextView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5050255/

相关文章:

android: 像 gmail 一样的 MultiAutoCompleteTextView 风格

android - 当媒体播放器完成播放时调用另一个 Activity

android - 从 onItemClick 确定 AutoCompleteTextView

android - 进行碰撞检测的最佳方法是什么?

ios - 滚动时 Collection View 单元格重复

java - Android:TextView 自动截断并替换字符串的最后 3 个字符

安卓自定义 View : Set canvas size to wrap bitmap

android - 在 View 上调用 getWidth()/getHeight() 的正确时机是什么时候?

java - 如何从 flutter 中正确调用 android native 代码(包括 android/IOS)?

android - 如何在android studio中添加Git项目