我使用ActionBar实现了三个选项卡。片段是以编程方式编码的。
我想设置listener on Fragment2 (Tab2),这样当Fragment1通过回调(自定义listener)发送一些数据时,Fragment2会更新它的内容字段。
我想不出办法,希望能帮上忙。
发布于 2012-04-02 22:53:00
最好的方法可能是通过活动来实现。因此,当片段处理事件时,它会通知活动,然后活动决定如何处理它,并将其传递给其他片段之一。
我建议避免直接在片段之间发送消息,因为活动知道哪些片段正在使用中。
发布于 2012-04-02 22:57:58
这里有几个选项。
让您的包含活动管理所执行的操作-因此,让该活动实现由您的片段定义的回调接口,并将您的活动转换为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线程中操作(您确实希望它不在UI线程中操作),因此如果您要进行任何UI操作,请在Handler中进行,否则将获得异常
https://stackoverflow.com/questions/9978245
复制相似问题