有没有一种方法像结果起始片段一样工作?
我现在有一个覆盖片段。 这是为了login到服务。 在电话应用程序中,我想要在叠加层中显示的每个步骤都是他们自己的屏幕和活动。 有三个部分的login过程,每个都有自己的活动,这是用startActivityForResult()调用的。
现在我想用碎片和叠加层来做同样的事情。 叠加层将显示与每个活动对应的片段。 问题是这些片段被托pipe在Honeycomb API中的活动中。 我可以得到第一个片段的工作,但是我需要startActivityForResult(),这是不可能的。 是否有startFragmentForResult()的行,我可以开始一个新的片段,当它完成了它返回一个结果到前一个片段?
所有的碎片都存在于活动中。 开始一个片段的结果没有多大意义,因为它的活动总是有权访问它,反之亦然。 如果Fragment需要传递一个结果,它可以访问它的Activity并设置它的结果并完成它。 在单个活动中交换片段的情况下,活动仍然可以被两个片段访问,并且所有消息传递都可以简单地通过活动。
只要记住,你总是有一个片段和它的活动之间的沟通。 开始和完成的结果是活动之间的沟通机制 – 活动然后可以委托任何必要的信息到他们的片段。
如果你愿意,碎片之间有一些通信方法,
setTargetFragment(Fragment fragment, int requestCode) getTargetFragment() getTargetRequestCode()
你可以使用这些callback。
Fragment invoker = getTargetFragment(); if(invoker != null) { invoker.callPublicMethod(); }
我的2美分。
我通过使用隐藏和显示/添加(现有/新build)来replace旧片段与新片段之间的切换。 所以这个答案适用于像我一样使用片段的开发者。
然后我使用onHiddenChanged
方法知道旧片段从新的片段切换回来。 看下面的代码。
在离开新的片段之前,我将一个结果设置为一个全局参数,以便被旧的片段查询。 这是一个非常天真的解决scheme。
@Override public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); if (hidden) return; Result result = Result.getAndReset(); if (result == Result.Refresh) { refresh(); } } public enum Result { Refresh; private static Result RESULT; public static void set(Result result) { if (RESULT == Refresh) { // Refresh already requested - no point in setting anything else; return; } RESULT = result; } public static Result getAndReset() { Result result = RESULT; RESULT = null; return result; } }
在你的片段中,你可以调用getActivity()。 这将使您能够访问创build该片段的活动。 从那里你可以调用你的自定义方法来设置值或传递值。