Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.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 - Fatal编程技术网

Java 片段互通

Java 片段互通,java,android,Java,Android,我使用ActionBar实现了三个选项卡。 片段是按程序编码的 我想在Fragment2选项卡2上设置listener,以便当Fragment1通过回调自定义listener发送一些数据时,Fragment2更新其内容字段 我想不出做这件事的方法,非常感谢您的帮助。最好的方法可能是通过活动来做。因此,当一个片段处理一个事件时,它会通知活动,然后活动决定如何处理它,并将其传递给其他片段之一 我建议避免在片段之间直接发送消息,因为活动知道当前正在使用哪些片段。最好的方法可能是通过活动执行。因此,当一

我使用ActionBar实现了三个选项卡。 片段是按程序编码的

我想在Fragment2选项卡2上设置listener,以便当Fragment1通过回调自定义listener发送一些数据时,Fragment2更新其内容字段


我想不出做这件事的方法,非常感谢您的帮助。

最好的方法可能是通过活动来做。因此,当一个片段处理一个事件时,它会通知活动,然后活动决定如何处理它,并将其传递给其他片段之一


我建议避免在片段之间直接发送消息,因为活动知道当前正在使用哪些片段。

最好的方法可能是通过活动执行。因此,当一个片段处理一个事件时,它会通知活动,然后活动决定如何处理它,并将其传递给其他片段之一


我建议避免在片段之间直接发送消息,因为活动就是知道当前正在使用的活动。

这里有几个选项

让您的包含活动管理所执行的操作—让该活动实现由您的片段定义的回调接口,并将您的活动强制转换到onAttach中的回调:

或者,您也可以注册BroadcastReceiver来处理第一个片段的意图广播:

public class MyFragment1 extends Fragment {

  public static final String ACTION_UPDATE = "com.example.MyFragment.update"

  public void updateOther() {
    Intent i = new Intent(ACTION_UPDATE);
    getActivity().sendBroadcast(i);
  }
  ...
}

public class MyFragment2 extends Fragment {
  private BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
      if (intent.getAction().equals(MyFragment1.ACTION_UPDATE)) {
        // Do stuff
      }
    }
  }

  @Override
  public void onCreate(Bundle savedInstanceState) {
    IntentFilter if = new IntentFilter(MyFragment1.ACTION_UPDATE);
    getActivity().registerReceiver(mReceiver, if);
  }

  @Override
  public void onDestroy() {
    getActivity().unregisterReceiver(mReceiver);
  }
}

请记住,您的onReceive调用可能在UI线程中运行,也可能不在UI线程中运行,您真的希望它不在UI线程中运行,因此,如果您执行任何UI操作,请在a线程中执行,否则会出现异常

您在此处有两个选项

让您的包含活动管理所执行的操作—让该活动实现由您的片段定义的回调接口,并将您的活动强制转换到onAttach中的回调:

或者,您也可以注册BroadcastReceiver来处理第一个片段的意图广播:

public class MyFragment1 extends Fragment {

  public static final String ACTION_UPDATE = "com.example.MyFragment.update"

  public void updateOther() {
    Intent i = new Intent(ACTION_UPDATE);
    getActivity().sendBroadcast(i);
  }
  ...
}

public class MyFragment2 extends Fragment {
  private BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
      if (intent.getAction().equals(MyFragment1.ACTION_UPDATE)) {
        // Do stuff
      }
    }
  }

  @Override
  public void onCreate(Bundle savedInstanceState) {
    IntentFilter if = new IntentFilter(MyFragment1.ACTION_UPDATE);
    getActivity().registerReceiver(mReceiver, if);
  }

  @Override
  public void onDestroy() {
    getActivity().unregisterReceiver(mReceiver);
  }
}

请记住,您的onReceive调用可能在UI线程中运行,也可能不在UI线程中运行,您真的希望它不在UI线程中运行,因此,如果您执行任何UI操作,请在a中执行,否则您将遇到异常

我对此也很感兴趣。为什么使用广播会更复杂?只需要编写更多的代码,您必须管理广播接收器的生命周期-但它确实会将您的活动排除在数据管理之外,并将其保留在片段中,使您的活动代码更干净、更相关-如果您愿意,我将添加示例我对此也感兴趣。为什么使用广播会更复杂?只需编写更多的代码,您就必须管理广播接收器的生命周期-但它确实将您的活动排除在数据管理之外,并将其留给片段,使您的活动代码更干净、更相关-如果您愿意,我将添加示例