繁体   English   中英

从在RecyclerView.Adapter内部调用的Activity的Fragment上获取onActivityResult

[英]get onActivityResult on Fragment from Activity that called inside RecyclerView.Adapter

好的,这是我的问题

  1. 我有一个包含RecyclerView的Fragment,当然还有一个包含内容的适配器(称为ApprovalCutiCardAdapter )。
  2. 在该ApprovalCutiCardAdapter内,我在卡上设置了OnClickListener,当单击Card时,它将启动一个名为DetailApprovalCuti的活动。 这是我启动活动的代码

     ((Activity) MyApplication.getmContext()).startActivityForResult(detailApprovalCutiIntent, 1); 
  3. DetailApprovalCuti我正在执行finishActivity(1)来获取onActivityResult事件。 但是,并不是在所有地方都调用该事件(在承载该片段的活动中以及该片段中)

     @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { Log.e("result", "ApprovalIzinCutiFragment"); super.onActivityResult(requestCode, resultCode, data); } 
  4. 这是我启动Acvitity的代码

     @Override public void onBindViewHolder(final CutiViewHolder holder, final int position) { .... holder.cv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent detailApprovalCutiIntent = new Intent(MyApplication.getmContext(), DetailApprovalCuti.class); Bundle b = new Bundle(); b.putParcelable("cuti", ApprovalCutiCardAdapter.allCuti.get(position)); b.putParcelable("process_cuti", ApprovalCutiCardAdapter.allCuti.get(position).getProcessCuti()); detailApprovalCutiIntent.putExtras(b); ((Activity)MyApplication.getmContext()).startActivityForResult(detailApprovalCutiIntent,1); } }); .... } 
  5. 这是我完成活动的代码

     btnReject.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { new AlertDialog.Builder(DetailApprovalCuti.this) .setTitle("Peringatan") .setMessage("Apakah anda yakin?") .setIcon(android.R.drawable.ic_dialog_alert) .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { setResult(1); finish(); } }).setNegativeButton(android.R.string.no, null).show(); } }); 

您的Activity应该由片段“为结果”开始,例如: startActivityForResult(detailApprovalCutiIntent, 1); 而不是 ((Activity) MyApplication.getmContext()).startActivityForResult(detailApprovalCutiIntent, 1); -然后在承载Fragment的Activity中可以处理onActivityResult ,但是您想将此事件传播到Fragment 因此,您调用super.onActivityResult(requestCode, resultCode, data); -您将会看到类似:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
   super.onActivityResult(requestCode, resultCode, data);   
}

然后,在Fragment中,您可以处理onActivityResult回调。

请查看这些紧密相关的问题,并尝试选择的答案:

我希望这能为您带来启发。

问题在于,在下一行中,您正在从一个Activity调用startActivityForResult() ,而该Activity可能不是您所期望的。

((Activity)MyApplication.getmContext()).startActivityForResult(detailApprovalCutiIntent, 1);

考虑到您的适配器是从Fragment设置的,您应该将上面的行修改为:

fragment.getActivity().startActivityForResult(detailApprovalCutiIntent, 1);

学习到教训了

切勿使用单身人士,因为单身人士是病理说谎者

PS:单实例很好,但单例(如全局变量)是一个不好的设计,必须避免。

我认为您的设计不必要地复杂,并且将Activity,Fragment和RecyclerView的适配器紧密地结合在一起。

尝试以下方法:

  • 当适配器检测到卡上的咔嗒声时,请适配器将其传达给它的父卡(在本例中为“片段”)。
  • 当片段被通知点击时,让它通知其父对象(活动)
  • 当Fragment通知Activity时,让它(Activity)使用startActivityForResult启动新的Activity
  • 当Activity在onActivityResult上获取结果时,使其对结果进行任何处理。 如果片段中需要该结果,请将其传达给片段。

下一个问题是片段与活动之间如何通信。 “标准”答案是创建一对接口,让Activity实现一个接口,而Fragment实现另一个接口,然后使用接口方法来回调用。

这可能很难正确完成,因为活动和片段必须仔细跟踪彼此的生命周期,以免崩溃。

我发现更好,更轻松的解决方案是使用消息总线(例如Otto)在它们之间传递消息。 这样,Activity和Fragment仅在准备就绪时才需要向总线注册和注销,而您完全可以避免生命周期问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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