【发布时间】:2015-08-27 00:44:07
【问题描述】:
我有一个关于 Android 中“正确编程”的问题。
我目前正在使用片段开发应用程序。它涉及到动态添加片段到 Activity、从 XML 膨胀的片段、来自 XML 的嵌套片段或动态添加。随便说一下吧。
这个问题关注的概念是片段所涉及的通信过程。所以,我已经阅读了文档,这不是我第一次尝试使用片段。
常识(和文档)告诉我们,如果 Fragment 想要与它的 Activity 说话或交流,我们应该使用接口。
例子:
测试片段
public class TestFragment extends Fragment {
private TestFragmentInterface listener;
public interface TestFragmentInterface {
void actionMethod();
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
if (getActivity() instanceof TestFragmentInterface) {
listener = (TestFragmentInterface) getActivity();
}
// sending the event
if (listener != null) listener.actionMethod();
}
}
TestActivity
public class Test implements TestFragmentInterface {
@Override
public void actionMethod() {
..
}
}
这里一切正常。
这提高了可重用性,因为我的 TestFragment 可以通过这种方式与任何类型的 Activity 交互,只要 Activity 实现了我声明的接口。
反过来,Activity 可以通过持有引用并调用其公共方法与片段进行交互。这也是片段间通信的建议方式,使用 Activity 作为桥梁。
这很酷,但有时感觉为此使用界面有点“太多”。
问题 A
在这个场景中,我附加的片段有一个非常集中的角色,这意味着它们是为那个特定的活动完成的,不会被使用,忽略接口实现而只是做类似的事情在概念上是错误的
((TestActivity) getActivity().myCustomMethod();
?
这也适用于(不是我的情况,只是将其视为“最糟糕的情况”)我的活动必须处理各种各样的这些不同片段的情况,这意味着它应该为每个片段实现一种方法它应该处理。这会使代码变成一大堆“可能不需要的行”。
进一步:仍然使用“聚焦”片段,旨在仅在某种方式下工作,嵌套片段的用途是什么?
像这样添加它们
public class TestFragment extends Fragment {
private void myTestMethod() {
NestedFragment nested = new NestedFragment();
getChildFragmentManager()
.beginTransaction()
.add(R.id.container, nested)
.commit();
}
}
这会将 NestedFragment 绑定到 TestFragment。我再说一遍,NestedFragment 和 TestFragment 一样,只能这样使用,否则没有任何意义。
回到问题,在这种情况下我应该如何表现?
问题 B
1) 我应该在 NestedFragment 中提供一个接口,并让 TestFragments 实现 NestedFragmentInterface 吗?在这种情况下,我会按照以下方式行事
嵌套片段
public class NestedFragment extends Fragment {
private NestedFragmentInterface listener;
public interface NestedFragmentInterface {
void actionMethodNested();
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
if (getParentFragment() instanceof NestedFragmentInterface) {
listener = (NestedFragmentInterface) getParentFragment();
}
// sending the event
if (listener != null) listener.actionMethodNested();
}
}
2) 我应该(或可以)忽略接口,而只是调用
getParentFragment().publicParentMethod();
?
3) 我应该在 NestedFragment 中创建接口,但让 activity 实现它,以便 activity 调用 TestFragment 吗?
问题 C
关于使用 Activity 作为片段之间的桥梁的想法,我相信这样做是为了正确处理所有这些对象的生命周期。在尝试手动处理系统可能抛出的异常时,直接进行片段到片段(使用接口或直接调用公共方法)是否仍然可行?
【问题讨论】:
-
看看这是否有帮助:corner.squareup.com/2014/10/…
-
我已经阅读了您发布的链接,虽然这确实是一篇包含大量信息的有趣文章,但恐怕它并不能回答我的问题。还是谢谢你
标签: android interface fragment communication