我使用ActionBar实现了三个Tabs。 片段以编程方式编码。
我想在Fragment2(Tab2)上设置监听器,以便当Fragment1通过回调(Custom listener)发送一些数据时,Fragment2会更新其内容字段。
我无法找到办法,希望得到帮助。
答案 0 :(得分:2)
最好的方法可能是通过活动来完成。因此,当片段处理事件时,它会通知Activity,然后Activity决定如何处理它,并将其传递给其他片段之一。
我建议避免在Fragments之间直接发送消息,因为Activity知道当前正在使用的内容。
答案 1 :(得分:2)
你有几个选择。
让您的包含活动管理所执行的操作 - 让活动实现您的片段定义的回调接口,并将您的活动转换为onAttach()
中的回调:
private MyListener mListener
public void onAttach(Activity activity) {
try {
mListener = (MyListener) activity;
}
catch (ClassCastException e) {
throw new IllegalArgumentException("Calling activity must implement MyListener");
}
}
或者,您可以注册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操作,请在Handler或你会得到一个例外