Android 片段不';在onActivityResult中未收到正确的结果

Android 片段不';在onActivityResult中未收到正确的结果,android,android-intent,android-activity,android-fragments,onactivityresult,Android,Android Intent,Android Activity,Android Fragments,Onactivityresult,我在一个活动的片段中得到了一个列表,它启动了一个detailactivity,其中包含一个包含所选对象信息的片段 如果选择了其中一个操作项,则活动的结果为OK,如果再次选择,则结果切换回Cancelled。我只想在用户导航回列表时传递此结果。 我已经消除了几个问题,并且在listfragment中使用了onActivityResult函数,但是结果代码不是我传递的。 调试时,我还注意到listactivity中的onActivityResult函数从未被触发 列表活动: @Override pr

我在一个活动的片段中得到了一个列表,它启动了一个detailactivity,其中包含一个包含所选对象信息的片段

如果选择了其中一个操作项,则活动的结果为OK,如果再次选择,则结果切换回Cancelled。我只想在用户导航回列表时传递此结果。 我已经消除了几个问题,并且在listfragment中使用了onActivityResult函数,但是结果代码不是我传递的。 调试时,我还注意到listactivity中的onActivityResult函数从未被触发

列表活动:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.i("LA", "onActivityResult: " + resultCode);
    super.onActivityResult(requestCode, resultCode, data);
}
列表片段:

/**
 * Launch detail activity
 */
public class OnObjectClickListener implements OnItemClickListener {

    public OnObjectClickListener() {
        super();
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Log.i("OnObjectClickListener", "Selected an object");
        ObjectAdapter adapter = (ObjectAdapter) _objList.getAdapter();
        Object o = adapter.getItem(position);

        Intent i = new Intent(adapter.getContext(), DetailActivity.class);
        i.putExtra(DetailActivity.ARG_OBJCODE, o.getCode());
        startActivityForResult(i, DetailActivity.ARG_FOLLOW_OBJ_CHANGE);
    }
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.i("LF", "Activity result received");
    if (requestCode == DetailActivity.ARG_FOLLOW_OBJ_CHANGE
        && resultCode == Activity.RESULT_OK
        && data != null
        && data.hasExtra(DetailActivity.ARG_OBJCODE)){
        // Update object in the list: following indicator has changed
        String objcode = data.getStringExtra(DetailActivity.ARG_OBJCODE);
        ObjectAdapter oa = (ObjectAdapter) _objList.getAdapter();
        for (Object o : oa.getObjects()){
            // Toggle following state in the game
            if (o.getCode().equals(objcode)){
                o.setFollowing(!o.isFollowing());
                oa.notifyDataSetChanged();
                Log.i("LF", "Edited dataset");
                break;
            }
        }
        Log.i("LF", "Result processed");
    } else {
        super.onActivityResult(requestCode, resultCode, data);
        Log.i("LF", "Result not recognized");
    }
}
这就是我试图将结果返回到上一个listfragment的方式:

@Override
public void onBackPressed() {
    super.onBackPressed();

    // config result
    Intent i = new Intent();
    i.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
    i.putExtra(DetailActivity.ARG_OBJCODE, _objCode);
    int result = _followStateChanged ? Activity.RESULT_OK : Activity.RESULT_CANCELED;
    if (getParent() == null){
        setResult(result, i);
    } else {
        getParent().setResult(result, i);
    }
    this.finish();
    Log.i("DA", "Back pressed, intent passed and set as a result");
}
。。。getParent()始终为空

结果代码总是0,有人知道我哪里出错了吗? 我已经参考了这些答案,应用并测试了它们,得到了进一步的解决方案,但尚未找到解决方案:


**我还遇到了OnActivityResult()的相同问题。如果主机活动的OnActivityResult()片段被调用而不是片段的,则必须更改实现bc。您应该在方法末尾调用super。不是开始

@Override 
public void onBackPressed() {

    // config result 
    Intent i = new Intent();
    i.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
    i.putExtra(DetailActivity.ARG_OBJCODE, _objCode);
    int result = _followStateChanged ? Activity.RESULT_OK : Activity.RESULT_CANCELED;
    if (getParent() == null){
        setResult(result, i);
    } else { 
        getParent().setResult(result, i);
    } 
    this.finish();
    Log.i("DA", "Back pressed, intent passed and set as a result");

    super.onBackPressed(); 
} 

与使用getParent与活动通信不同,您应该使用接口并创建侦听器。您的意思是与上一个活动通信吗?getParent用于第二个详细信息活动,但从不调用if结构的else括号。。。你还会这样做吗?这是获得反馈的另一种方式,希望利用结果。无论哪种方式。与父片段的通信应该始终通过@Martin提到的侦听器进行。我的问题不是没有调用该方法,而是结果代码没有正确传递……这确实是问题所在。我还删除了过时的this.finish();线路。
@Override 
public void onBackPressed() {

    // config result 
    Intent i = new Intent();
    i.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
    i.putExtra(DetailActivity.ARG_OBJCODE, _objCode);
    int result = _followStateChanged ? Activity.RESULT_OK : Activity.RESULT_CANCELED;
    if (getParent() == null){
        setResult(result, i);
    } else { 
        getParent().setResult(result, i);
    } 
    this.finish();
    Log.i("DA", "Back pressed, intent passed and set as a result");

    super.onBackPressed(); 
}