当前位置: 首页 > 知识库问答 >
问题:

片段在onActivityResult中未收到正确的结果

高慈
2023-03-14

我在一个活动的片段中有一个列表,它启动了一个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");
    }
}

动作项目详细活动:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    DetailFragment df = (DetailFragment) getFragmentManager().findFragmentByTag(_objCode);

    switch (item.getItemId()) {
    case android.R.id.home:
        NavUtils.navigateUpFromSameTask(this);
        return true;
    case R.id.action_follow_obj:
        if (df != null){
            df.followObj(true);
            configResult();
        }
        break;
    case R.id.action_unfollow_obj:
        if (df != null){
            df.followObj(false);
            configResult();
        }
        break;
    }
    return super.onOptionsItemSelected(item);
}
/** Sets the result of this activity (did the following parameter change, or not?)
 * @return nothing */
private void configResult() {
    // switch follow state monitor: statechange is true upon uneven changes
    // meaning the state is not really changed if the game is first followed and subsequently unfollowed
    _followStateChanged = !_followStateChanged;
    Log.i("DA", "State changed: " + _followStateChanged);
}

这就是我试图将结果返回到上一个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中的超级调用片段
  • 我采取的一般做法
  • 验证使用的方法
  • 覆盖并传递到片段

共有2个答案

沈乐邦
2023-03-14

**我也遇到了同样的问题OnActivityResult()你必须改变你的实现bc在片段的情况下主机活动的OnActivityResult()被称为不是片段的**

裴泰平
2023-03-14

应该在方法末尾调用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(); 
} 
 类似资料:
  • 我的代码中有以下工作流程。我有,它启动一个新的使用starActivityForResult(意图,请求代码)。活动B有一个片段,比如,它包含一个listview(它的适配器有一个arraylist)和下面的编辑文本,可以将新值添加到listview中。 我打算将数据发送回。我在中实现了一个接口,该接口在同一片段的onPause()方法中调用。 子任务是在“编辑文本”中从“添加”按钮添加新项时更新

  • 问题是,此AutoResolveHelper不是对片段调用onActivityResult,而是只对Activity调用onActivityResult。 我读过这样的东西: 如果您从片段调用startActivityForResult(),那么您应该调用startActivityForResult(),而不是getActivity().startActivityForResult(),因为这将导

  • 请注意,此问题不是以下问题的重复: https://stackoverflow.com/questions/19006776/onactivityresult-not-working-with-fragments onActivityResult不处理片段 此外,之前也有人问过类似的问题,但这并没有提到方向的变化(目前尚未解决)。 如果不切换方向,则会调用片段中的onActivityResult方

  • 我正在创建Spring boot web Application。出于模板目的,我使用了thymeleaf。我正在创建单独的html页面片段,并从这些片段创建两个不同的布局。但是,当我连接内容页面时,我没有得到正确的输出。 请检查代码片段/ 视图解析器 目录结构 应用布局。html 页脚片段footer.html 使用此方法创建不同的片段。 主方法类aka startup 欢迎html 现在,当我

  • 我在google上搜索onactivityresult()是不推荐的。但我的问题没有解决。下面是片段的代码