Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将信息从一个片段发送到另一个片段_Java_Android_Android Fragments - Fatal编程技术网

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使用这个反射密集的库