我不明白为什么我的应用程序一直在崩溃。根据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时,它只强制关闭。 所有帮助表示赞赏!谢谢!
答案 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)
您正在获取NPE,因为您没有从发件人活动发送捆绑,而只是添加一个字符串。因此,要在接收器活动中访问String extra,请使用:
getIntent().getStringExtra("gridPressed");
要发送包,您需要首先创建一个包,然后向该包添加额外内容,然后使用intent传递包:
Bundle bundle = new Bundle();
bundle.putString("KEY", "VALUE");
intent.putExtras(bundle);
如果您发送2中提到的捆绑包,则接收活动中的现有代码将起作用,否则您可以更改接收活动中的代码,如1中所述。