4

强制在 UI 线程中运行的 settext 上引发的 Android Null 指针异常

runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        String name=portalData.getFullname();

                        setContentView(R.layout.gradebook);
                            tname.setText(name);

                           }
                });

我在 Create Im 上做了一个 TextView 的静态成员

super.onStart();

    setContentView(R.layout.gradebook);
      tname=(TextView)findViewById(R.id.fullname); 

无法理解导致此堆栈跟踪的原因

10-15 15:19:07.090: E/AndroidRuntime(1604): FATAL EXCEPTION: main
10-15 15:19:07.090: E/AndroidRuntime(1604): java.lang.NullPointerException
10-15 15:19:07.090: E/AndroidRuntime(1604):     at com.example.campus.Gradebook$ObservableDemo$6.run(Gradebook.java:518)
10-15 15:19:07.090: E/AndroidRuntime(1604):     at android.os.Handler.handleCallback(Handler.java:730)
10-15 15:19:07.090: E/AndroidRuntime(1604):     at android.os.Handler.dispatchMessage(Handler.java:92)
10-15 15:19:07.090: E/AndroidRuntime(1604):     at android.os.Looper.loop(Looper.java:137)
10-15 15:19:07.090: E/AndroidRuntime(1604):     at android.app.ActivityThread.main(ActivityThread.java:5103)
10-15 15:19:07.090: E/AndroidRuntime(1604):     at java.lang.reflect.Method.invokeNative(Native Method)
10-15 15:19:07.090: E/AndroidRuntime(1604):     at java.lang.reflect.Method.invoke(Method.java:525)
10-15 15:19:07.090: E/AndroidRuntime(1604):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-15 15:19:07.090: E/AndroidRuntime(1604):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-15 15:19:07.090: E/AndroidRuntime(1604):     at dalvik.system.NativeStart.main(Native Method)

这是XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".vbook" >

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="70dp"
        android:layout_marginTop="40dp"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="#007FFF" />
</RelativeLayout>
4

4 回答 4

13

扭转这些

  TextView tname=(TextView)findViewById(R.id.fullname); 
  setContentView(R.layout.vbook);

findViewById查找具有当前膨胀布局中提到的 id 的视图。

因此,如果您即使在颠倒上述两个语句之后也获得 NPE,您应该检查您vbook.xml是否有一个带有 id 的 textview fullname

此外,您的视图的所有初始化通常都是在onCreateui 线程中完成的。我不确定您要做什么。

您有以下内容vbook.xml

   <TextView
    android:id="@+id/textView3"

所以改为TextView tname=(TextView)findViewById(R.id.textView3)

于 2013-10-15T19:03:27.593 回答
3

空引用是因为 TextView 为空。为了

TextView tname=(TextView)findViewById(R.id.fullname);

要返回 TextView,您必须先初始化布局。将代码更改为,你会做得很好:

setContentView(R.layout.vbook);    
TextView tname=(TextView)findViewById(R.id.fullname); 
于 2013-10-15T19:05:28.670 回答
1

在使用findViewById(id)映射视图之前,应始终调用setContentView(layout )

如果在反转后发生相同的错误,请确保您尝试映射的 id 在您的布局文件中可用

于 2013-10-15T19:05:28.187 回答
0

正如@Ravi 所说, Set contentview 应该总是在绑定视图之前。除此之外,在您发布的 xml 中没有像 R.id.fullname 这样的 id。取而代之的是 textview3 所以,试试这个代码:

setContentView(R.layout.gradebook);// I assume gradebook is your xml file 

tname=(TextView)findViewById(R.id.textView3);  //textView3 is the id you passed in TextView. 

希望这对您有所帮助。

于 2018-05-30T05:13:35.573 回答