Java 片段互通
我使用ActionBar实现了三个选项卡。 片段是按程序编码的 我想在Fragment2选项卡2上设置listener,以便当Fragment1通过回调自定义listener发送一些数据时,Fragment2更新其内容字段Java 片段互通,java,android,Java,Android,我使用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中执行,否则您将遇到异常我对此也很感兴趣。为什么使用广播会更复杂?只需要编写更多的代码,您必须管理广播接收器的生命周期-但它确实会将您的活动排除在数据管理之外,并将其保留在片段中,使您的活动代码更干净、更相关-如果您愿意,我将添加示例我对此也感兴趣。为什么使用广播会更复杂?只需编写更多的代码,您就必须管理广播接收器的生命周期-但它确实将您的活动排除在数据管理之外,并将其留给片段,使您的活动代码更干净、更相关-如果您愿意,我将添加示例