将信息从一个片段发送到另一个Android

时间:2017-09-21 19:26:54

标签: java android android-fragments

我遇到这个问题,我有嵌套片段。我需要一个能够向另一个发送信息。

例如,如果我按下内部片段中的按钮,我希望外部片段执行操作。

任何帮助都会很棒!

编辑:我忘了提到这两个都是活片段。据我所知,使用bundle只允许我在创建片段时设置参数,但不能在创建片段后设置。

3 个答案:

答案 0 :(得分:2)

有很多方法可以解决这个问题。这真的取决于你想要的架构。

你可以懒惰并使用一个总线库,它使用子/ pub建模和反射来通知已注册并具有匹配的签名变更方法的通用对象。但是,对于常规编码实践可能使用反射这是不赞成的。没有它就实现了。

我想说你可以使用像dataChange(myObject obj)这样的方法创建一个代表IMainActivityCallbacks之类来回调用的接口 。 然后在你的onAttach片段中,你将上下文转换为IMainActivityCallbacks。确保MainActivity实现接口。

然后只需调用mIMainActivityCallbacks.dataChange(someObject); 这将调用父活动中的方法,并允许他使用mMyOtherFragment.publicMethod(newDataJustReceived)将其传递给需要它的子片段。

如果你想要你也可以变得更疯狂并将接口传递给引用外部片段的子片段,这样当MainActivity新闻子片段时,外部可以实现doStuff的接口,然后作为接口传递给内部儿童片段。因此,子片段可以很容易地说是否是" mParentInterface"不是mParentInterface.doStuff。

有数百万种皮肤猫的方法,但更喜欢使用接口而不是基于反射的库。希望有所帮助。

答案 1 :(得分:1)

在这种情况下使用界面。 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.....

希望这会有所帮助。

答案 2 :(得分:0)

在这种情况下我使用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();
}