【问题标题】:Null pointer exception in TextViewTextView 中的空指针异常
【发布时间】:2012-04-20 04:09:44
【问题描述】:

这是我的布局

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

       <TextView 
        android:id = "@+id/postQues"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Post A Question" />

          <TextView
              android:id="@+id/postAnswer"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_alignParentBottom="true"
              android:layout_alignParentLeft="true"
              android:layout_alignParentRight="true"
              android:text="Post Your Answer" />

          <Button
              android:id="@+id/submit"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_alignParentBottom="true"
              android:layout_alignParentRight="true"
              android:clickable="true"     
              android:text="Submit" />
      </RelativeLayout>

这是我的活动:

package com.qstack.quizbox;

import roboguice.activity.RoboActivity;
import roboguice.inject.ContentView;
import roboguice.inject.InjectView;
import android.content.DialogInterface;
import android.view.View.OnClickListener;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.app.main.R;

@ContentView(R.layout.q_box)
public class QuizBox extends RoboActivity {

    @InjectView(R.id.postQues) TextView postQues;
    @InjectView(R.id.postAnswer) EditText postAnswer;
    //@InjectView(R.id.submit) Button submitA;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        PostQuestion postQuestion = new PostQuestion();
        postQues.setText(postQuestion.postQuestion());

        submitA.setOnClickListener(submitAnswerListener);
    }

     private OnClickListener submitAnswerListener = new OnClickListener() {
         //onClick view
         public void onClick(View v) {
             String answer;
             answer = postA.getText().toString();

             CheckAnswer checkAnswer = new CheckAnswer();

             if (answer == checkAnswer.checkAnswer()) {
                 postA.setText("Correct");
             }
         }
     };
}

我在第 48 行收到一个空指针异常,原因是 postQues = null。当我从代码中删除 postAnswer 时,没有空指针异常。我已经清理了我的项目和所有这些。任何帮助

【问题讨论】:

  • 你能粘贴你的机器人活动吗

标签: android roboguice


【解决方案1】:
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.yourxml); // you have missed this.....
    PostQuestion postQuestion = new PostQuestion();
    postQues.setText(postQuestion.postQuestion());
    submitA.setOnClickListener(submitAnswerListener);
}

【讨论】:

  • 你好,我在这里遇到了同样的问题,但是和 Puck 一样,我也在公共类行上方添加了 @ContentView(R.layout.mine)。为什么不起作用?
【解决方案2】:

我遇到了同样的问题,并遵循了 Mackovich 的建议。他指出你不需要使用 RoboGuice 的 setContentView() 是对的,只要你用 @ContentView 注释你的活动。

就我而言,问题是由于我已将 AutoCompleteTextView 替换为 EditText,但忘记在活动中使用相应的 @InjectView 进行相同的替换。这导致了我的 NullPointerException。

再次,就像 Mackovich 说的,如果我使用 setContentView() 而不是 @ContentView,stacktrace 会给我一个更有用的信息:

Caused by: java.lang.IllegalArgumentException: Can't assign class android.support.v7.internal.widget.TintEditText value android.support.v7.internal.widget.TintEditText@426ce048 to class android.widget.AutoCompleteTextView field usernameTextView

我猜这是反对使用 Roboguice 的 @ContentView 的论据,至少在修复以显示正确的堆栈跟踪之前是这样。

【讨论】:

  • 那么它是如何回答这个问题的呢?
  • 它回答了这个问题,指出您应该使用 setContentView() 而不是 @ContentView,以便看到更清晰的异常消息。就像我说的那样,就我而言,NPE 是由于我试图注入错误的视图类型而引起的。但我只是在使用 setContentView() 之后才知道这一点。
  • 谢谢,帮我解决了问题!
【解决方案3】:

你错过了那条线

 setContentView(R.layout.xml_filename);

【讨论】:

    【解决方案4】:

    我还不能评论你的回答,但人们没有抓住重点:他和我一样,正在使用RoboGuice 来注入观点和内容。

    此框架的唯一目的是避免 onCreate() 上的样板部分,您将不再需要使用 setContentViewfindViewById()

    至于他为什么得到NullePointerException,我不知道。我碰巧在我的一项活动中遇到了同样的问题,尽管它在所有其他活动上都很好......

    [编辑]

    我找到了解决方案:我混淆了两个视图的类型。 如果你把setContentView() 放在它应该在的地方,你会得到错误。 应用程序会说它不能分配。因为类型不匹配。 因此,您会得到一个不错的

    java.lang.RuntimeException: 无法启动活动组件信息

    但是如果你使用RoboGuice 框架,你会得到这样的错误(在我的情况下我没有)。但是,您的所有查看都将是null

    希望有一天它会对某人有所帮助。

    【讨论】:

    • 谢谢,帮我解决了问题!
    • @McLovin 不客气。 Rboguice 非常方便,但您必须小心谨慎,以免出现奇怪的异常,因为 Roboguice 改变了视图的实例化方式,因此会将您引向错误的路径而无法解决。
    【解决方案5】:

    您在代码中忘记了以下行,

    setContentView(R.layout.main);
    

    应该在onCreate()方法这一行之后

    super.onCreate(savedInstanceState);  
    

    【讨论】:

      【解决方案6】:

      您需要先致电setContentView(R.layout.the_xml)(紧跟在super.onCreate() 之后)。否则 RoboGuice 不知道将什么注入到您的变量中!

      【讨论】:

        猜你喜欢
        • 2021-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多