不明白为什么我得到NullPointerException

时间:2014-05-03 22:06:37

标签: android android-intent

我不明白为什么我的应用程序一直在崩溃。根据LogCat,它是由一行上的NullPointerExeption引起的,但是,我无法找到它发生的原因。应该发生的是,通过按下另一个活动上的按钮,可以在MainActivity中更改ImageView的图像资源。我已经遵循了多个指南,但得到了反复出现的错误。从我所看到的情况发生时,额外的信息通过Intent传递,有些东西是null但我找不到它。

logcat的

05-03 22:33:03.158: E/AndroidRuntime(31629): Caused by: java.lang.NullPointerException
05-03 22:33:03.158: E/AndroidRuntime(31629): at com.crackedporcelain.crackedcalibration.MainActivity.onCreate(MainActivity.java:21)

第21行(MainActivity中的违规者)

String gridPressed = content.getString("gridPressed");

主要活动(收件人)

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Bundle content = getIntent().getExtras();

    // Set image based on which button was pressed
    String gridPressed = content.getString("gridPressed");
    ImageView spotlightOne = (ImageView) findViewById(R.id.variousOne);

    if (gridPressed.equals("one")) {
        spotlightOne.setImageResource(R.drawable.one);
    } else if (gridPressed.equals("two")) {
        spotlightOne.setImageResource(R.drawable.two);
    } else {
        spotlightOne.setImageResource(R.drawable.one);
    }

    ImageView buttonGrid = (ImageView) findViewById(R.id.phoneReference);

    buttonGrid.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            startActivity(new Intent(
                    "com.crackedporcelain.crackedcalibration.IDENTIFICATION"));
        }
    });
}

其他活动(发件人)

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.identification);

    ImageView gridButton1 = (ImageView) findViewById(R.id.buttonImage1);
    ImageView gridButton2 = (ImageView) findViewById(R.id.buttonImage2);

    gridButton1.setOnClickListener(this);
    gridButton2.setOnClickListener(this);
}

@Override
public void onClick(View v) {

    switch (v.getId()) {
    case R.id.buttonImage1:
        Intent oneA = new Intent(IdentificationActivity.this, MainActivity.class);
        oneA.putExtra("gridPressed", "one");
        startActivity(oneA);
        break;
    case R.id.buttonImage2:
        Intent oneB = new Intent(IdentificationActivity.this, MainActivity.class);
        oneB.putExtra("gridPressed", "two");
        startActivity(oneB);
        break;
    }
}

其他信息

这些类的布局设置正确,它们工作正常。当我尝试使用Intents时,它只强制关闭。 所有帮助表示赞赏!谢谢!

2 个答案:

答案 0 :(得分:0)

收到的意图不包含任何额外值。确保发送意图的代码已将意图添加到名为" gridPressed"的额外字符串值。您可以使用Intent.putExtra(String, String)来实现此目的。

如果没有额外的值,

Intent.getExtras()将返回null。此外,如果null不包含密钥,Bundle.getString(String key)将返回Bundle

最后,请务必检查MainActivity是否以其他方式不可调用(例如单击应用程序图标时)。如果可以,那么此版本的onCreate()将更好用:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ImageView spotlightOne = (ImageView) findViewById(R.id.variousOne);

    // Set image based on which button was pressed, if any
    String gridPressed = getIntent().getStringExtra("gridPressed");
    if ("one".equals(gridPressed)) {
        spotlightOne.setImageResource(R.drawable.one);
    } else if ("two".equals(gridPressed)) {
        spotlightOne.setImageResource(R.drawable.two);
    } else {
        spotlightOne.setImageResource(R.drawable.one);
    }

    ImageView buttonGrid = (ImageView) findViewById(R.id.phoneReference);

    buttonGrid.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            startActivity(new Intent(
                    "com.crackedporcelain.crackedcalibration.IDENTIFICATION"));
        }
    });
}

答案 1 :(得分:0)

  1. 您正在获取NPE,因为您没有从发件人活动发送捆绑,而只是添加一个字符串。因此,要在接收器活动中访问String extra,请使用:

    getIntent().getStringExtra("gridPressed");
    
  2. 要发送包,您需要首先创建一个包,然后向该包添加额外内容,然后使用intent传递包:

    Bundle bundle = new Bundle();
    bundle.putString("KEY", "VALUE");
    intent.putExtras(bundle);
    
  3. 如果您发送2中提到的捆绑包,则接收活动中的现有代码将起作用,否则您可以更改接收活动中的代码,如1中所述。