代码之家  ›  专栏  ›  技术社区  ›  Lyan Dwi Pangestu

从RecyclerView.Adapter内调用的Activity中获取片段的onActivityResult

  •  0
  • Lyan Dwi Pangestu  · 技术社区  · 8 年前

    好吧,这是我的问题

    1. 我有一个包含RecyclerView的片段,当然还有一个适配器(称为 ApprovalCutiCardAdapter )保存内容的。
    2. 在里面 批准CutiCardAdapter 我在卡上设置了OnClickListener,当单击卡时,它将启动名为 DetailApprovalCuti 。这是我启动活动的代码

      ((Activity) MyApplication.getmContext()).startActivityForResult(detailApprovalCutiIntent, 1);
      
    3. 在里面 我正在执行 finishActivity(1) 获得的事件 onActivityResult 。但并不是在所有地方都调用该事件(在托管片段的Activity中,以及在片段中)

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

      @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();
          }
      });
      
    3 回复  |  直到 8 年前
        1
  •  1
  •   Sufian    8 年前

    问题是,在下面的行中,您正在呼叫 startActivityForResult() 可能不是您期望的活动。

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

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

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

    吸取的教训

    不要使用单例 Singletons are Pathological Liars .

    聚苯乙烯: 单实例很好,但单例(如全局变量)是一种糟糕的设计,必须避免。

        2
  •  1
  •   Community CDub    7 年前

    你的 Activity 应该由片断“for results”启动,如: startActivityForResult(detailApprovalCutiIntent, 1); 而不是 ((Activity) MyApplication.getmContext()).startActivityForResult(detailApprovalCutiIntent, 1); -然后在 活动 它承载了您可以处理的碎片 onActivityResult -但您希望将此事件传播到 Fragment .所以你打电话给 super.onActivityResult(requestCode, resultCode, data); -您将得到如下内容:

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

    然后在片段中,您可以处理 onActivityResult(活动结果) 回调。

    请看一看这些密切相关的问题,并尝试选定的答案:

    我希望这能给你点启发。

        3
  •  0
  •   GreyBeardedGeek    8 年前

    我认为您的设计是不必要的复杂,它将Activity、Fragment和RecyclerView的适配器耦合得太紧密了。

    改为尝试以下操作:

    • 当适配器检测到卡上的点击时,让它与其父级(在本例中为Fragment)进行通信。
    • 当Fragment收到点击通知时,让它通知它的父级(Activity)
    • 当片段通知“活动”时,让它(“活动”)用startActivityForResult启动新的“活动”
    • 当“活动”在onActivityResult上获得结果时,让它对结果执行所需的任何操作。如果片断中需要该结果,请让它将结果传达给片断。

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

    这可能很难正确执行,因为Activity和Fragment必须仔细跟踪彼此的生命周期,以免崩溃。

    我发现一个更好、更简单的解决方案是使用消息总线(如Otto)在他们之间传递消息。这样,Activity和Fragment只需要在准备就绪时注册到总线并从总线取消注册,您就完全避免了生命周期问题。