【问题标题】:How to transfer a data from fragment which is started another fragment to an activity如何将数据从启动另一个片段的片段传输到活动
【发布时间】:2015-11-02 02:48:19
【问题描述】:

我有一个调用另一个 fragmentA 的活动。现在这个 fragmentA 调用另一个 fragmentB。现在我想将数据从 fragmentB 传输到我的活动

【问题讨论】:

  • 实现一个接口,并在activity中重写它的方法,并从将数据传递给方法的fragment中调用它。
  • 片段 A 和 B 是否属于同一个活动?
  • 是的,两个片段都属于同一个活动
  • @milez 链接可以解决这个问题。跟着它!

标签: android android-fragments android-activity


【解决方案1】:

检查这个:Communicating with Other Fragments

定义一个接口(在片段中)

要允许 Fragment 与其 Activity 进行通信,您可以在 Fragment 类中定义一个接口并在 Activity 中实现它。 Fragment 在其 onAttach() 生命周期方法期间捕获接口实现,然后可以调用接口方法以与 Activity 通信。

以下是 Fragment 到 Activity 通信的示例:

public class HeadlinesFragment extends ListFragment {
    OnHeadlineSelectedListener mCallback;

    // Container Activity must implement this interface
    public interface OnHeadlineSelectedListener {
        public void onArticleSelected(int position);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            mCallback = (OnHeadlineSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
        }
    }

    ...
}

现在片段可以通过使用 OnHeadlineSelectedListener 接口的 mCallback 实例调用 onArticleSelected() 方法(或接口中的其他方法)将消息传递给 Activity。

例如,当用户单击列表项时,会调用片段中的以下方法。 Fragment 使用回调接口将事件传递给父 Activity。

@Override
public void onListItemClick(ListView l, View v, int position, long id)   {
    // Send the event to the host activity
    mCallback.onArticleSelected(position);
}

实现接口(在活动中)

为了从片段接收​​事件回调,承载它的活动必须实现片段类中定义的接口。

例如,以下活动实现了上例中的接口。

public static class MainActivity extends Activity
        implements HeadlinesFragment.OnHeadlineSelectedListener{
    ...

    public void onArticleSelected(int position) {
        // The user selected the headline of an article from the HeadlinesFragment
        // Do something here to display that article
    }
}

PS1:EventBus 适合您,但如果需要,请谨慎使用,它可能会使您的代码更难阅读。

PS2:不要在 Fragment.newInstance() 中传递活动实例并使用它进行通信。活动实例可能在后台被销毁。像示例一样在 Fragment.onAttach() 中获取活动实例,框架会为您处理销毁、重新创建和重新绑定。

【讨论】:

    【解决方案2】:

    您可以通过在fragmentB中调用getActivity()来获取Activity的实例,并使用接口传递数据。

    【讨论】:

      【解决方案3】:

      你可以通过重写onAttach()方法来获取Activity实例

      方法:1

      @Override
      public void onAttach(Activity activity) {
          // TODO Auto-generated method stub
          super.onAttach(activity);
          this.activity=(ActivityName) activity;
      }
      

          activity.setdata(yourdata);
      

      方法:2

      ((ActivityName)getActivity()).setdata(yourdata);
      

      通过这些方式你需要在你的activity中创建一个setter方法

      这是从任何片段获取其父活动的回调的最简单方法。Dev Doc here 很好地解释了

      【讨论】:

        【解决方案4】:

        如果您认为可以使用 EventBus,您将需要在应用程序的不同部分中使用类似的功能,并且您不想为这只海豚编写很多接口。 你可以使用https://github.com/greenrobot/EventBus

        例子:

        添加编译'de.greenrobot:eventbus:2.4.0', 注册活动 OnCreate -

        EventBus.getDefault().register(this);
        

        和 OnDestroy-

        EventBus.getDefault().unregister(this);
        

        比添加一个带有接收对象参数和 onEventMainThread 名称的方法:

        public void onEventMainThread(YourObject name) {...}
        

        现在可以从任何 Fragment 调用

        EventBus.getDefault().post(yourObjectInstance);
        

        活动会检测到它。

        或者你可以使用 RxJava 来获得类似的效果 - http://nerds.weddingpartyapp.com/tech/2014/12/24/implementing-an-event-bus-with-rxjava-rxbus/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-20
          • 1970-01-01
          相关资源
          最近更新 更多