Java 将信息从一个片段发送到另一个片段
我有一个问题,我有嵌套片段。我需要一个能够向另一个发送信息 例如,如果我按下内部片段中的按钮,我希望外部片段执行操作 任何帮助都会很好Java 将信息从一个片段发送到另一个片段,java,android,android-fragments,Java,Android,Android Fragments,我有一个问题,我有嵌套片段。我需要一个能够向另一个发送信息 例如,如果我按下内部片段中的按钮,我希望外部片段执行操作 任何帮助都会很好 编辑:我忘了提到这两个都是活片段。据我所知,使用bundle只允许我在创建片段时设置参数,而不是在创建片段后设置参数。有很多方法可以管理它。这实际上取决于您想要采用的体系结构 您可能会变得懒惰,并使用一个总线库,该库使用sub/pub建模和反射来通知已注册并具有匹配签名方法的更改的通用对象,但是,不赞成将反射用于可以在没有反射的情况下实现的常规编码实践 我想说的
编辑:我忘了提到这两个都是活片段。据我所知,使用bundle只允许我在创建片段时设置参数,而不是在创建片段后设置参数。有很多方法可以管理它。这实际上取决于您想要采用的体系结构 您可能会变得懒惰,并使用一个总线库,该库使用sub/pub建模和反射来通知已注册并具有匹配签名方法的更改的通用对象,但是,不赞成将反射用于可以在没有反射的情况下实现的常规编码实践 我想说的是,您可以创建一个接口来表示调用,该接口可以像IMainActivityCallbacks一样来回调用,也可以使用dataChange(myobjectobj)等方法 . 然后在片段的onAttach中,将上下文转换为IMainActivityCallbacks。确保MainActivity实现了该接口 然后只需调用mIMainActivityCallbacks.dataChange(someObject); 这将调用父活动中的方法,并允许他通过mMyOtherFragment.publicMethod(newDataJustReceived)将其传递给需要它的子片段 如果需要,还可以更疯狂地将接口传递到引用外部片段的子片段中,这样当MainActivity更新子片段时,外部片段可以实现doStuff接口,然后作为接口传递给内部子片段。因此,子片段可以很容易地说,如果“mParentInterface”不是null,那么mParentInterface.doStuff
有数百万种方法可以剥猫皮,但通常更喜欢使用接口而不是基于反射的库。希望这能有所帮助。好吧,有很多方法可以解决这个问题。这实际上取决于您想要采用的体系结构 您可能会变得懒惰,并使用一个总线库,该库使用sub/pub建模和反射来通知已注册并具有匹配签名方法的更改的通用对象,但是,不赞成将反射用于可以在没有反射的情况下实现的常规编码实践 我想说的是,您可以创建一个接口来表示调用,该接口可以像IMainActivityCallbacks一样来回调用,也可以使用dataChange(myobjectobj)等方法 . 然后在片段的onAttach中,将上下文转换为IMainActivityCallbacks。确保MainActivity实现了该接口 然后只需调用mIMainActivityCallbacks.dataChange(someObject); 这将调用父活动中的方法,并允许他通过mMyOtherFragment.publicMethod(newDataJustReceived)将其传递给需要它的子片段 如果需要,还可以更疯狂地将接口传递到引用外部片段的子片段中,这样当MainActivity更新子片段时,外部片段可以实现doStuff接口,然后作为接口传递给内部子片段。因此,子片段可以很容易地说,如果“mParentInterface”不是null,那么mParentInterface.doStuff
有数百万种方法可以剥猫皮,但通常更喜欢使用接口而不是基于反射的库。希望有帮助。在这种情况下,我使用greenrobot EventBus。 您需要将此库添加到生成梯度:
compile 'org.greenrobot:eventbus:3.0.0'
您可以发送这样的消息:
EventBus.getDefault().post(new ActionEvent("test action"));
另一个片段可以这样捕捉它:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onActionEvent(ActionEvent event) {
//do something
}
如果愿意,您可以以相同的方式发送不同的操作。
别忘了根据碎片生命周期:
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
在这种情况下,我使用greenrobot事件总线。 您需要将此库添加到生成梯度:
compile 'org.greenrobot:eventbus:3.0.0'
您可以发送这样的消息:
EventBus.getDefault().post(new ActionEvent("test action"));
另一个片段可以这样捕捉它:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onActionEvent(ActionEvent event) {
//do something
}
如果愿意,您可以以相同的方式发送不同的操作。
别忘了根据碎片生命周期:
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
在这种情况下使用接口。1) 在第一个片段中定义接口(在该片段中单击某些内容并等待第二个片段中发生某些内容),并使用在接口中定义的回调方法。例如:
OnButtonClickListener mCallback;
......your code
public interface OnButtonClickListener {
void onButtonSelected(int position);
}
......your code
then you call your callback method
.....
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
mCallback.onButtonSelected(position);
}
});
public class MainActivity extends AppCompatActivity implements YourFragment.OnButtonClickListener{....
public void onButtonSelected(int position) {
...Here just change something in your second fragment.....
3) 在此活动中定义接口的回调方法。例如:
OnButtonClickListener mCallback;
......your code
public interface OnButtonClickListener {
void onButtonSelected(int position);
}
......your code
then you call your callback method
.....
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
mCallback.onButtonSelected(position);
}
});
public class MainActivity extends AppCompatActivity implements YourFragment.OnButtonClickListener{....
public void onButtonSelected(int position) {
...Here just change something in your second fragment.....
希望这会有所帮助。在这种情况下使用界面。1) 在第一个片段中定义接口(在该片段中单击某些内容并等待第二个片段中发生某些内容),并使用在接口中定义的回调方法。例如:
OnButtonClickListener mCallback;
......your code
public interface OnButtonClickListener {
void onButtonSelected(int position);
}
......your code
then you call your callback method
.....
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
mCallback.onButtonSelected(position);
}
});
public class MainActivity extends AppCompatActivity implements YourFragment.OnButtonClickListener{....
public void onButtonSelected(int position) {
...Here just change something in your second fragment.....
3) 在此活动中定义接口的回调方法。例如:
OnButtonClickListener mCallback;
......your code
public interface OnButtonClickListener {
void onButtonSelected(int position);
}
......your code
then you call your callback method
.....
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
mCallback.onButtonSelected(position);
}
});
public class MainActivity extends AppCompatActivity implements YourFragment.OnButtonClickListener{....
public void onButtonSelected(int position) {
...Here just change something in your second fragment.....
希望这会有帮助。我这里遇到的一个大问题是,我的片段没有ID,所以我不能对它们调用publicMethod()。你说它们没有ID是什么意思?你没有为他们创建碎片类吗?等等,我太傻了。我得到了它。谢谢这有助于解决一个问题我这里的大问题是我的片段没有ID,所以我不能对它们调用publicMethod()。你说它们没有ID是什么意思?你没有为他们创建碎片类吗?等等,我太傻了。我得到了它。谢谢这有助于Bunkkyrl,在推荐之前考虑事件总线权重。当您进行快速而肮脏的编码时,这是可以的,但我不建议将这个反射密集的库用于这样一个简单的回调任务。查看源代码,您将看到此库中使用的所有反射。这对企业级可扩展应用程序不好。山姆,我仔细看了一下,认为你是对的。非常感谢。Kirill,在推荐它之前考虑事件总线权重。当您进行快速而肮脏的编码时,这是可以的,但我不建议为这样的simp使用这个反射密集的库