gpt4 book ai didi

android - 子类 SurfaceView 中的 findViewById 抛出 RuntimeException

转载 作者:行者123 更新时间:2023-11-29 15:33:00 25 4
gpt4 key购买 nike

如果我将 findViewById 调用移动到 Activity 中,此代码可以正常工作。关于为什么它在 LearningView 类内部不起作用的任何提示?我试过将 TextView 移动到 com.example.LearningView 标签内,但没有任何乐趣。我更愿意从 SurfaceView 子类中获取 TextView,因为我觉得将电视视为 SV 的“子级”更合乎逻辑。

这是我为找出更大应用程序中的问题而编写的人为示例,但其要点是相同的,堆栈跟踪也基本相同。

就其值(value)而言,findViewById 调用返回 null,这显然在一些修复此问题的尝试中引发了 NullPointerExceptions。

正如您可能从我的尝试中了解到的那样,我在这个问题上是盲目的。

学习.java:

package com.example.Learning;

import android.app.Activity;
import android.os.Bundle;

public class Learning extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}

学习 View .java:

package com.example.Learning;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.TextView;

public class LearningView extends SurfaceView implements SurfaceHolder.Callback {
public LearningView(Context context, AttributeSet atts) {
super(context, atts);
getHolder().addCallback(this);
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
TextView t = (TextView) findViewById(R.id.contents);
t.setText("testing");
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}

主.xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.example.Learning.LearningView
android:id="@+id/learningview" android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<TextView android:id="@+id/contents" android:layout_gravity="bottom|left"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:textColor="#ffffffff" />
</FrameLayout>

堆栈跟踪:

Thread [<3> main] (Suspended (exception RuntimeException))  
ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2454
ActivityThread.handleLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2470
ActivityThread.access$2200(ActivityThread, ActivityThread$ActivityRecord, Intent) line: 119
ActivityThread$H.handleMessage(Message) line: 1821
ActivityThread$H(Handler).dispatchMessage(Message) line: 99
Looper.loop() line: 123
ActivityThread.main(String[]) line: 4310
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 521
ZygoteInit$MethodAndArgsCaller.run() line: 860
ZygoteInit.main(String[]) line: 618
NativeStart.main(String[]) line: not available [native method]

最佳答案

您正在崩溃,因为您的 TextViewfindViewById() 之后为空。 TextView 不是 SurfaceView 的子级,因此以 SurfaceView 为起点调用 findViewById()不会找到它。

关于android - 子类 SurfaceView 中的 findViewById 抛出 RuntimeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3897176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com