[英]Intent returning null value onActivityResult
您好
我有一个MainActivity类,它扩展了DashboardActivity类。 在主活动类中,有顶部操作栏,单击该按钮将转到AddReminderActivity类。 顶部操作栏的操作在“仪表板活动类”中定义为
private void createReminder() {
// TODO: fill in implementation
Intent intent = new Intent(DashboardActivity.this,AddReminderActivity.class);
Log.i("in OnActivityResult", "create reminder called");
startActivityForResult(intent, ACTIVITY_CREATE);
Log.i("in OnActivityResult", "Start Activity called Result");
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
Log.i("in OnActivityResult", "Activity Result" + resultCode);
super.onActivityResult(requestCode, resultCode, intent);
Log.i("in OnActivityResult", "Activity Result" + resultCode);
Log.i("in OnActivityResult", "intent Result" + intent.getExtras());
Bundle extras = intent.getExtras();
Toast.makeText(getApplicationContext(),resultCode, Toast.LENGTH_SHORT).show();
switch(requestCode){
case ACTIVITY_CREATE:
if (resultCode == Activity.RESULT_OK) {
String title = extras.getString(ReminderDBAdapter.KEY_REMINDER_TITLE);
String content = extras.getString(ReminderDBAdapter.KEY_REMINDER_CONTENT);
mDbHelper.createReminder(title, content);
mDbHelper.close();
}
startActivity(new Intent(this,ListReminder.class));
break;
}
// TODO: fill in rest of method
}
在AddReminderActivityClass上,我已经调用了
btnSubmitReminder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Bundle bundle = new Bundle();
bundle.putString(ReminderDBAdapter.KEY_REMINDER_TITLE, mReminderTitle.getText().toString());
bundle.putString(ReminderDBAdapter.KEY_REMINDER_CONTENT, mReminderContent.getText().toString());
if(mRowId != null){
bundle.putLong(ReminderDBAdapter.KEY_ROWID, mRowId);
}
System.out.println(mReminderTitle.getText().toString());
Toast.makeText(getApplicationContext(), mReminderTitle.getText().toString(), Toast.LENGTH_SHORT).show();
Intent mIntent = new Intent();
mIntent.putExtras(bundle);
//setResult(RESULT_OK, mIntent);
if (getParent() == null) {
setResult(DashboardActivity.RESULT_OK, mIntent);
} else {
getParent().setResult(DashboardActivity.RESULT_OK, mIntent);
}
Log.i("in OnActivityResult", "set result" +RESULT_OK);
finish();
}
});
但是,当返回OnActivityResult时,该意图返回null并发生以下异常。 我不知道是什么问题
05-16 17:25:09.686: ERROR/AndroidRuntime(441): FATAL
例外:主要05-16 17:25:09.686:ERROR / AndroidRuntime(441):java.lang.RuntimeException:传送结果ResultInfo {who = null,request = 0,result = -1,data = Intent {(有附加功能)失败)}}到活动{com.babz.android.businessReminder / com.babz.android.businessReminder.MainActivity}:android.content.res.Resources $ NotFoundException:字符串资源ID#0xffffffff 05-16 17:25:09.686:错误/ AndroidRuntime(441):位于android.app.ActivityThread.deliverResults(ActivityThread.java:3515)05-16 17:25:09.686:ERROR / AndroidRuntime(441):位于android.app.ActivityThread.handleSendResult(ActivityThread.java: 3557)05-16 17:25:09.686:错误/ AndroidRuntime(441):位于android.app.ActivityThread.access $ 2800(ActivityThread.java:125)05-16 17:25:09.686:错误/ AndroidRuntime(441):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2063)05-16 17:25:09.686:ERROR / AndroidRuntime(441):在android.os.Handler.dispatchMessage(Handler.java:99)05- 16 17:25:09.686:ERROR / AndroidRuntime(441):位于android.os。 Looper.loop(Looper.java:123)05-16 17:25:09.686:ERROR / AndroidRuntime(441):位于android.app.ActivityThread.main(ActivityThread.java:4627)05-16 17:25:09.686: ERROR / AndroidRuntime(441):在java.lang.reflect.Method.invokeNative(本机方法)05-16 17:25:09.686:ERROR / AndroidRuntime(441):在java.lang.reflect.Method.invoke(方法java:521)05-16 17:25:09.686:ERROR / AndroidRuntime(441):位于com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)05-16 17:25:09.686:错误/ AndroidRuntime(441):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)05-16 17:25:09.686:错误/ AndroidRuntime(441):在dalvik.system.NativeStart.main (本地方法)05-16 17:25:09.686:错误/ AndroidRuntime(441):原因:android.content.res.Resources $ NotFoundException:字符串资源ID#0xffffffff 05-16 17:25:09.686:错误/ AndroidRuntime (441):位于android.content.res.Resources.getText(Resources.java:201)05-16 17:25:09.686:ERROR / AndroidRuntime(441):位于android.widget.Toast.makeTex t(Toast.java:258)05-16 17:25:09.686:ERROR / AndroidRuntime(441):at com.babz.android.businessReminder.DashboardActivity.onActivityResult(DashboardActivity.java:68)05-16 17:25: 09.686:ERROR / AndroidRuntime(441):在android.app.Activity.dispatchActivityResult(Activity.java:3890)05-16 17:25:09.686:ERROR / AndroidRuntime(441):在android.app.ActivityThread.deliverResults(ActivityThread的.java:3511)
正如Guru所说,您的setResult()方法没有被调用。 因此,永远不会设置意图。
我有一个单独的答案,因为有一个常见的问题需要解决:使用错误的 setResult()。
确保使用setResult(resultCode,intentData),而不是setResult(resultCode)。 我要强调一下,因为许多书籍中的许多示例都使用了后者,这意味着通过startActivityForResult()发送到Activity中的同一意图只会返回相同的意图。 必须直接添加所有Intent,否则每次onActivityResult()中的Intent都会为NULL。
实际上,问题出在这一行:
Toast.makeText(getApplicationContext(),resultCode, Toast.LENGTH_SHORT).show();
这将导致异常,因为参数resultCode
是一个int
,在这种情况下, makeText()
方法假定该值是资源ID(即: R.string.something
)。 但是,在这种情况下,值为-1并生成以下内容:
android.content.res.Resources$NotFoundException: String resource ID #0xffffffff
您实际上希望调用带有String
的makeText()
方法。 尝试这个:
Toast.makeText(getApplicationContext(),"ResultCode: " + resultCode,
Toast.LENGTH_SHORT).show();
取消注释setResult方法调用。
据我所知,当您尝试使用捆绑包中不存在的键获取值时,会出现异常,因此在您的情况下,可能是其中之一:
String title = extras.getString(ReminderDBAdapter.KEY_REMINDER_TITLE);
String content = extras.getString(ReminderDBAdapter.KEY_REMINDER_CONTENT);
您可以通过在捆绑软件上调用containsKey(String key)来询问捆绑软件是否存在该密钥,因此,我建议您使用它来查找是否存在这种情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.