我想得到字符串值,用户在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()?
请包含示例代码。感谢。
答案 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);
}