abh*_*hek 24 android android-fragments
在我的应用程序中,我有两个片段,分别是fragmentA和FragmentB.当我点击fragmetA中的按钮时,会在fragmentB中打开一个列表.现在,当我从fragmentB中的列表中选择一个项目时,我希望将结果传递给fragmentA.我只对所有片段使用一个TabActivity.当在fragmentB中选择列表项时,我从堆栈中弹出fragmentB,这样我就可以直接返回fragmentA了.
有谁知道如何将结果传递给以前的片段.
谢谢.
S.D*_*.D. 17
更新
Activity是父控制器,应该负责处理由其片段/视图引发的事件,这些事件涉及片段/视图本身范围之外的事物.
Fragment将充当其承载的Views 的子控制器.所有事件和它自己的观点之间的沟通,片段应该处理自己.当片段的范围和职责之外存在事件时(比如将数据发送到另一个片段),该事件应该升级到其父控制器Activity.
旧
从本教程:http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity
最好让活动对其片段应用更改,而不是直接在片段之间传递值.让您的Activity实现与方法的FragmentListener接口.onQuery(Bundle data)onResult(Bundle data)
FragmentListener在每个片段中创建一个变量,然后覆盖onAttach() 每个片段:
public void onAttach(Activity activity) {
super.onAttach(activity);
//---register parent activity for events---
try{
fragmentListener = (FragmentListener) activity;
}catch (ClassCastException e)
{
throw new ClassCastException("Parent activity must implement interface FragmentListener.");
}
}
Run Code Online (Sandbox Code Playgroud)
这将强制您的子片段自动注册到父Activity.
另外,请记得发布fragmentListener参考资料onDetach().
现在,您可以从片段中调用Activity.
另一方面,您的活动始终可以使用getFragmentManager().findFragmentByTag("fragmentA")或搜索片段findFragmentById("FragmentA").如果它可以找到你的片段,那么它可以将它转换为你的FragmentA类并调用它的方法.可以使用FragmentB或任何其他片段完成相同的操作.
小智 7
一种可能的解决方案:
public class DetachableResultReceiver extends ResultReceiver {
private Receiver mReceiver;
public DetachableResultReceiver(Handler handler) {
super(handler);
}
public void clearReceiver() {
mReceiver = null;
}
public void setReceiver(Receiver receiver) {
mReceiver = receiver;
}
public interface Receiver {
public void onReceiveResult(int resultCode, Bundle resultData);
}
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (mReceiver != null) {
mReceiver.onReceiveResult(resultCode, resultData);
}
}
}
Run Code Online (Sandbox Code Playgroud)
第一个片段实现DetachableResultReceiver.Receiver并创建DetachableResultReceiver对象:
mReceiver = new DetachableResultReceiver(new Handler());
mReceiver.setReceiver(this);
Run Code Online (Sandbox Code Playgroud)
然后你可以将它传递给第二个片段参数:
Bundle bundle = new Bundle();
bundle.putParcelable(Consts.EXTRA_RECEIVER, receiver);
fragment.setArguments(bundle);
Run Code Online (Sandbox Code Playgroud)
并在第二个片段中使用它:
receiver = getArguments().getParcelable(Consts.EXTRA_RECEIVER);
receiver.send(Consts.SOME_MESSAGE, someData);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20801 次 |
| 最近记录: |