Android:setResult 未将结果返回给父 Activity

Posted

技术标签:

【中文标题】Android:setResult 未将结果返回给父 Activity【英文标题】:Android: setResult not returning result to Parent Activity 【发布时间】:2016-05-04 19:12:14 【问题描述】:

我已经使用 startActivityForResult 从父活动开始了一个子活动。在子活动中执行所需功能后,我正在使用 setResult 设置结果。但是我没有从子活动中获得父活动的结果。

这是我的代码。

这是我如何从父活动中调用我的子活动。

 Intent i = new Intent(MainActivity.this, Child.class);
    i.putExtra("ID", intID);
    i.putExtra("aID", aID);
    i.putExtra("myMsg", myMsg);
    startActivityForResult(i, 1);

这就是我设置子活动结果的方式。

 @Override
    public void onBackPressed() 
        super.onBackPressed();
     Intent resultInt = new Intent();
     resultInt.putExtra("Result", "Done");
     setResult(Activity.RESULT_OK, resultInt);
     finish();

这是我的onActivityResult

   @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 1) 

        if (resultCode == Activity.RESULT_OK) 
            if(data!=null) 
                Toast.makeText(MainActivity.this, "Data received", Toast.LENGTH_SHORT).show();
            
        
    


当我检查 resultCode==Activity.RESULT_OK 时,结果为假。 而且我还检查了在这个 if 条件之外传递的意图及其返回 null。

 <activity
        android:name=".MainActivity"
        android:label="Main"
        android:parentActivityName=".MainPage"
        android:theme="@style/AppTheme.NoActionBar">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="org.mydomain.mydomain.MainPage" />
    </activity>
    <activity
        android:name=".Child"
        android:label="Child"
        android:parentActivityName=".MainActivity"
        android:theme="@style/AppTheme1">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="org.mydomain.mydomain.MainActivity" />
    </activity>

谁能帮我解决这个问题。

【问题讨论】:

@prashantpatil 我正在尝试将结果设置为子活动的父活动。但其结果并未发送到父活动。我在家长活动中没有得到任何结果。这就是问题所在。 setResult 不是设置结果。 把你的 super.onbackpress() 放在 setresult 方法下面就可以了兄弟 是的……它成功了……!!!谢谢@Ravind ..请将您的解决方案作为答案发布...您能告诉我为什么 super.onbackpress() 必须在下面吗? 【参考方案1】:

修改你的onBackPressed()方法

@Override
public void onBackPressed() 

 Intent resultInt = new Intent();
 resultInt.putExtra("Result", "Done");
 setResult(Activity.RESULT_OK, resultInt);
 super.onBackPressed();
 

原因:Backpress 操作是在将结果发送到父 Activity 之前执行了他的任务......

【讨论】:

没有必要在super.onBackPressed()之后调用finish(),因为基本实现已经完成了活动。【参考方案2】:

尝试不同的 Intent 构造函数。像这样:

    Intent resultIntent = new Intent(RESULT_NAME, Uri.parse("data"));
    setResult(RESULT_OK, resultIntent);
    finish();

原因是因为它可能正在寻找Uri 类型的数据。 签出this。

【讨论】:

照你说的做了...没用...同样的问题...仍然数据为空。 @Jishnu 你知道结果是不是没有返回,意思是结果是RESULT_CANCELED,还是结果是RESULT_OK,但它传回的数据是null 结果为 RESULT_CANCELED。并且数据为空。 好的,那么你的 setResult() 永远不会被收到。您的 UI 中是否有更改用户单击按钮或选择某些内容并发送结果的空间?将您的结果放入 onBackPressed() 可能会导致一些问题,但如果您正确实施,问题不在上面的代码中。您发送结果的活动行为/逻辑/算法是什么?把它放在你的问题中。 问题在于将 super.onbackpress() 放在 setResult() 之上,正如 Ravind Maurya 在上面的 cmets 中所指出的那样。问题现在已经解决了......无论如何感谢弗兰克的帮助。 【参考方案3】:

我认为你错过了一些编码部分。

    您的代码排列看起来不正确。

    您必须创建一个变量来接收从 childActivity 传递的数据。

      @Override
            protected void onActivityResult(int requestCode, int resultCode, Intent data) 
                super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) 
              if (requestCode == 1) 
                 String ReceiveData = data.getStringExtra("Result"); // you have to receiveData
                    if(ReceiveData !=null) 
                        Toast.makeText(MainActivity.this, "Data received", Toast.LENGTH_SHORT).show();
                    
                
            
    
        
    

【讨论】:

我按照你说的尝试了。应用程序因错误而崩溃尝试调用虚拟方法'java.lang.String android.content.Intent.getStringExtra(java.lang.String)'在空对象引用上 另外请注意,如果在我检查 resultCode 时条件未满足。 resultInt.putExtra("Result", "Done");。您想将 String Done 传递给 Result 吗? 是的。我想将“完成”传递给父活动。 另外请注意,虽然我设置了 RESULT_OK,但我的 resultCode 正在变为 RESULT_CANCELED【参考方案4】:

在您的父 Activity 中编写 finish()。

【讨论】:

以上是关于Android:setResult 未将结果返回给父 Activity的主要内容,如果未能解决你的问题,请参考以下文章

android中 activity1中启动了activity2, activity2中启动了activity3,怎么把activity3中的值直接返回给

startActivityForResult调用后立即响应了OnActivityResult()方法,导致setResult()后无响应

Android 上的相机示例

Android专治Activity各种疑难杂症

Android专治Activity各种疑难杂症

DeferredResult使用方式和场景