繁体   English   中英

如何将三个片段的数据发送到单个活动?

[英]How to send data of three fragments to single activity?

我有一个更简单的问题,但我无法在互联网上找到答案。 这是交易:我有三个片段,我需要将每个片段的数据发送到一个活动,然后打开另一个活动。 我打算用一个接口来做到这一点。 那么,我需要为每个片段创建一个三个接口并在活动上实现它们吗? 我有三个实现获取每个活动的数据? 在做代码之前,我需要它。 提前致谢。

演示图像

首先,让我们创建一个interface

interface MyInterface {
     fun onSomethingDone(someData: Int)  //A sample function, you can customize it your needs.
 }

然后

像这样覆盖你的活动中的onAttachFragment 永远记住这个规则, 永远不要将片段紧密地耦合到一个活动 因此,您可以做的是检查片段并执行相应的操作,如下所示:

class MyActivity : AppCompatActivity() {

    override onAttachFragment(fragment: Fragment) {

           when (fragment) { //A switch statement, checking using instanceOf() in Java.
             is Fragment1 -> fragment.firstFragmentListener = this //Proviving context of your activity to public variable of each fragment.
             is Fragment2 -> fragment.secondFragmentListener = this
             is Fragment3 -> fragment.thirdFragmentListener = this
         }
     }
 }

这将确保您在设置自定义侦听器时不会将片段紧密耦合,例如将其转换为特定活动的上下文。

让我们移动到碎片

 class Fragment1 : Fragment() {

     var firstFragmentListener: MyInterface? =  null  //public member, we are accessing it in our activity method, look above! 

      override onCreate() {

          myButton.setOnClickListener {
              firstFragmentListener.onSomethingDone(999) // Just sending random integer as the method parameter.
           }
       }
  }

这个样本片段类应该让您充分了解如何设置它。 正如实现此片段类的方式,您可以使用Fragment2和Fragment3执行相同的操作。

回到我们的活动

但这一次,我们将实现一个监听器方法。

class MyActivity : AppCompatActivity(), MyInterface {

   override fun onSomethingDone(someData: Int) {
      when (someData) {
         999 -> //Came from first fragment
         1000 -> //Second fragment
         1001 -> //Third fragment
      }
    }

    override onAttachFragment(fragment: Fragment) {

           when (fragment) { //A switch statement, checking using instanceOf() in Java.
             is Fragment1 -> firstFragmentListener = this //Proviving context of your activity to public variable of each fragment.
             is Fragment2 -> secondFragmentListener = this
             is Fragment3 -> thirdFragmentListener = this
         }
     }
 }

这是关于它,我将连接一个链接,给你一个疯狂的想法。 多个片段的单一界面 虽然ViewModel是第二代Android开发的一部分,但它提供了各种优势,而不仅仅是片段和活动之间的相互通信。

您可以通过New> Java Class创建一个单独的接口,然后在对话框中选择Kind> Interface 然后,您将所需的方法添加到接口,并让您的Activity实现它。 执行此操作后,您将转到Fragments并在onAttach(Context context)方法中获取该接口的实例,如下所示:

    @Override
    public void onAttach(@NonNull Context context)
    {
        Log.d(TAG, "onAttach:true");

        super.onAttach(context);

        if (context instanceof OnFragmentInteractionListener)
        {
            mFragmentInteractionListener = (OnFragmentInteractionListener) context;
        }
        else
        {
            throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener");
        }
    }

现在,您可以通过在Fragment类中的任何位置说mFragmentInteractionListener.deleteInternet(true)来调用Interfaces方法。

如果您还有其他问题,请在评论中告诉我。

暂无
暂无

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

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