【问题标题】:How to set startActivityForResult from an adapter and get the result in a viewPager fragment如何从适配器设置 startActivityForResult 并在 viewPager 片段中获取结果
【发布时间】:2018-11-11 12:11:19
【问题描述】:

我知道有几个相关的主题,但我都试过了,但没有任何反应。我有一个“MainActivity”类,其中包含一个名为“HomeFragment”的片段,该片段包含一个带有两个片段的 viewPager,其中一个片段称为“ListFragment”。通过设置一个名为“ListAdapter”的适配器,每个项目的 onClick 方法都可以正常工作,问题出在我设置时:

                intentRequestDetails.putExtra(KEY_POSITION, position);
                intentRequestDetails.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                ((Activity) context).startActivityForResult(intentRequestDetails, 2);

到适配器中的onItemClick, 我不知道如何在“ListFragment”中获得结果。 我将“getActivity()”传递给适配器和 ListFragment,但它们都不起作用! 请帮助我在“ListFragment”中获得结果

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 2) {
        if (resultCode == Activity.RESULT_OK) {
            int position = data.getIntExtra("position", -1);
            userRequestsViewModel.getResult().remove(position);
            viewHolder.rView.getAdapter().notifyItemRemoved(position);
            viewHolder.rView.getAdapter().notifyItemRangeChanged(position, viewHolder.rView.getAdapter().getItemCount());

        } else if (resultCode == Activity.RESULT_CANCELED) {
            //Write your code if there's no result
        }
    }

我需要什么 是什么从片段传递到适配器作为上下文?在哪里以及如何覆盖 onActivityResult 以及我是否还有其他遗漏?

  • ListFragment 中的 onActivityResult 未触发,因为正在从 ListAdapter 调用 startActivityForResult!我该如何处理?
  • 如果有机会更新列表,如何在 MainActivity 中获取适配器和 ListFragment?

【问题讨论】:

  • 如果您在 Activity 中重写了方法 onActivityResult,请确保您没有错过对 super.onActivityResult 的调用
  • 不,当我再次尝试时没有任何反应

标签: android android-fragments android-adapter startactivityforresult


【解决方案1】:

除了在fragment中覆盖onActivityResult,还需要在activity类中覆盖:

@Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Fragment fragment = getSupportFragmentManager().findFragmentById("yourFragment"); 
    fragment.onActivityResult(requestCode, resultCode, data); 
}

在片段中:

  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   //do something
  }

【讨论】:

  • 我做到了,但还是不行,我有一个有两个孩子和一个 MainActivity 的片段,我尝试了所有的可能性!
【解决方案2】:

经过数小时的研究,我终于解决了这个问题,如下所示: 由于我在一个活动中有两个嵌套片段作为子项和父项,并且我设计对每个项目执行操作,单击 recyclerView 项目并转到另一个活动以获取结果并刷新列表,我在 MainActivity 中添加了此代码:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Fragment fragment = getSupportFragmentManager().getFragments().get(1);
    fragment.onActivityResult(requestCode, resultCode, data);
}

选择要传递数据的目标片段(parentFragment),然后在该 parentFragment 中添加此方法:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    Fragment fragment = getChildFragmentManager().getFragments().get(1);
    fragment.onActivityResult(requestCode, resultCode, data);
}

将 onActivityResult 发送到子片段。毕竟在子片段中:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
     if (requestCode == 2){
        if (resultCode == Activity.RESULT_OK) {
            int position = data.getIntExtra("position", -1);
            userRequestsViewModel.getResult().remove(position);
            viewHolder.rView.getAdapter().notifyItemRemoved(position);
            viewHolder.rView.getAdapter().notifyItemRangeChanged(position, viewHolder.rView.getAdapter().getItemCount());
        }
    }
}

刷新 recyclerView 适配器并通知它一个项目已被删除!另一个重要的一点是,在适配器中我只是这样做了:

Intent intent = new Intent(view.getContext(), SecondActivity.class);

                intent.putExtra(KEY_POSITION, position);
                ((Activity) context).startActivityForResult(intent, 2);

并删除这行代码:

intentRequestDetails.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

当然,我将活动上下文从片段传递到适配器:简单

getContext()

如果你有一天遇到这样的问题,我希望这对你也有用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    相关资源
    最近更新 更多