【问题标题】:Sending information from one fragment to another Android将信息从一个片段发送到另一个 Android
【发布时间】:2017-09-21 19:26:53
【问题描述】:

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

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

任何帮助都会很棒!

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

【问题讨论】:

标签: java android android-fragments


【解决方案1】:

嗯,有很多方法可以解决这个问题。这实际上取决于您要使用的架构。

您可以偷懒并使用使用 sub/pub 建模和反射的 Bus 库来通知已注册并具有匹配的更改签名方法的通用对象,但是,不赞成使用反射进行常规编码实践,这可能是在没有它的情况下实现。

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

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

如果你想将一个接口传递给引用外部片段的子片段,那么当 MainActivity 通知子片段时,外部片段可以实现 doStuff 的接口,然后作为接口传递给内部子片段。所以子片段可以很容易地说如果“mParentInterface”不为空,那么mParentInterface.doStuff。

有数百万种方法可以给猫换皮,但通常更喜欢使用接口而不是基于反射的库。希望对您有所帮助。

【讨论】:

  • 我在这里遇到的大问题是我的片段没有 ID,所以我不能在它们上调用 publicMethod()。
  • 你是什么意思他们没有ID?您没有为他们创建片段类吗?
  • 等等,我傻了。我得到了它。谢谢!这帮助了一堆
【解决方案2】:

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

希望这会有所帮助。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • Kirill,在推荐之前考虑事件总线的权重。当您进行快速而肮脏的编码时,这是可以的,但我不建议将这种反射繁重的库用于如此简单的回调任务。查看源代码,您将看到该库中使用的所有反射。 github.com/greenrobot/EventBus/blob/master/EventBus/src/org/… 这不适合企业级可扩展应用程序。
    • 山姆,我仔细看了一下,觉得你是对的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 2016-05-05
    相关资源
    最近更新 更多