繁体   English   中英

意向返回null值onActivityResult

[英]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

您实际上希望调用带有StringmakeText()方法。 尝试这个:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM