【发布时间】:2017-09-21 19:26:53
【问题描述】:
我遇到了嵌套片段的问题。我需要一个能够向另一个发送信息。
例如,如果我按下内部片段中的按钮,我希望外部片段执行操作。
任何帮助都会很棒!
编辑:我忘了提到这两个都是实时片段。据我所知,使用 bundles 只允许我在创建片段时设置参数,而不是在创建片段之后。
【问题讨论】:
标签: java android android-fragments
我遇到了嵌套片段的问题。我需要一个能够向另一个发送信息。
例如,如果我按下内部片段中的按钮,我希望外部片段执行操作。
任何帮助都会很棒!
编辑:我忘了提到这两个都是实时片段。据我所知,使用 bundles 只允许我在创建片段时设置参数,而不是在创建片段之后。
【问题讨论】:
标签: java android android-fragments
嗯,有很多方法可以解决这个问题。这实际上取决于您要使用的架构。
您可以偷懒并使用使用 sub/pub 建模和反射的 Bus 库来通知已注册并具有匹配的更改签名方法的通用对象,但是,不赞成使用反射进行常规编码实践,这可能是在没有它的情况下实现。
我想说你可以创建一个接口来表示像 IMainActivityCallbacks 这样来回调用的接口,方法是 dataChange(myObject obj) . 然后在片段的 onAttach 中将上下文转换为 IMainActivityCallbacks。确保 MainActivity 实现了接口。
然后只需调用 mIMainActivityCallbacks.dataChange(someObject); 这将调用父活动中的方法,并允许他通过 mMyOtherFragment.publicMethod(newDataJustReceived) 将其传递给需要它的子片段。
如果你想将一个接口传递给引用外部片段的子片段,那么当 MainActivity 通知子片段时,外部片段可以实现 doStuff 的接口,然后作为接口传递给内部子片段。所以子片段可以很容易地说如果“mParentInterface”不为空,那么mParentInterface.doStuff。
有数百万种方法可以给猫换皮,但通常更喜欢使用接口而不是基于反射的库。希望对您有所帮助。
【讨论】:
在这种情况下使用接口。 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);
}
});
2) 然后在嵌套片段的宿主活动中实现这个接口。
例如:
public class MainActivity extends AppCompatActivity implements YourFragment.OnButtonClickListener{....
3) 在这个活动中定义你的接口的回调方法。例如:
public void onButtonSelected(int position) {
...Here just change something in your second fragment.....
希望这会有所帮助。
【讨论】:
在这种情况下,我使用 greenrobot EventBus。 您需要将此库添加到您的构建 gradle:
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();
}
【讨论】: