如果片段已经包含Bundle,如何将数据从片段A传递到片段B?

时间:2016-08-05 19:55:12

标签: java android

我想得到字符串值,用户在Fragment中的Spinner上按下动态更改为另一个片段。 所以我试图找到答案,我找到了两个:Interface和Bundle。 在我的情况下,似乎问题太具体了,我不知道如何解决这个问题。 接口选项似乎是最初的选择,但如何通过接口动态传递数据(用户创建的事件)? 另一方面,Bundle让我感到困惑。

我所有的片段,其中有4片,都明确地声明:

public class MyFragment extends Fragment{

private static final String FRAG_TAG = "my_fragment";
private static UUID mId = UUID.randomUUID();
private UUID getID(){return mId;}

...          

public static MyFragment newInstance(){

    MyFragment sMyFragment  = new MyFragment ();
    final Bundle args = new Bundle();
    args.putSerializable(FRAG_TAG, mId);
    sMyFragment.setArguments(args);
    return sMyFragment;}

public MyFragment (){} //empty constructor

...

}

并在我的MainActivity中的onCreate中初始化,这是所有'em的容器,如下所示:

  getSupportFragmentManager().beginTransaction()
            .add(R.id.my_fragment, MyFragment.newInstance(), "my_fragment").commit();

从那时起,我只显示/隐藏那些片段,这意味着Bundle保持不变。那么如何将Bundle添加到一个包含它的Bundle的片段中,并且只初始化一次,而不创建它的newInstance()?

请包含示例代码。感谢。

3 个答案:

答案 0 :(得分:0)

在这种情况下,您可以使用EventBus 看看这里:https://github.com/greenrobot/EventBus

答案 1 :(得分:0)

Bundle选项在这里并没有真正帮助,它适用于创建片段并希望将一些数据传递给它时(数据在创建片段时已知)。

您可能希望通过包含的Activity传递该数据,我将概述这一点(代码不完整/没有错误):

创建一个像

这样的回调界面
interface Callback{
   void selectionMade(Data data)
}

将回调传递给应该“发送”数据的Fragment,您的Activity可以实现回调,如:

MyFragment myFragment = MyFragment.instance()
myFragment.setCallback(this)

或匿名类:

myFragment.setCallback(new Callback(){
   void selectionMade(Data data){

         otherFragment.setData(data)

   }
})

在'发送'数据的Fragmend中,随时调用回调(例如用户选择的微调器):

callback.selectionDone(data)

当调用回调时,Activity通知'接收'数据片段(参见上面的匿名类示例)。

如果你的片段之间有很多沟通,你可能想考虑使用某种Event bus

答案 2 :(得分:0)

EventBus原来是答案。谢谢你的重播。 对于任何关心同样问题的人来说,我就是这样做的。

EventBus的默认类。

public class EventBus {    

private static EventBus mEventBus = new EventBus();

public static EventBus getEventBus() {
    return mEventBus;

  }
} 

设置和获取要传递的EventBus值的示例类。在我的案例中,字符串:

public class SomeValue{

private String name = "value";

public SomeValue(String string){name = string;}

public String getName() {return name;}

public void setName(String string) {this.name = string;}
}

在发送数据的片段中实现EventBus。在我的情况下,用于Button的onClick监听器:

...

@Override
        public void onClick(View view) {
            SomeValue message = new SomeValue("");
            GlobalEventBus.getEventBus().post(message);
        }

最后@Subscribe片段中的注释接收并打印数据:

...

@Subscribe
public void onEventReceived(SomeValue message){        
    setText(message.getName());
}
...

public void setText(String text){  
 //setText method (in the same fragment) bidden to TextView that prints the "message" given by EventBus
    TextView textView = (TextView) getActivity().findViewById(R.id.my_view);
    textView.setText(text);
}