我有一个关于在Android中“正确编程”的问题。
我目前正在使用片段(fragment)开发一个应用程序。它涉及动态添加片段到Activity,从XML膨胀的片段,以及从XML或动态添加的嵌套片段。让我们说,几乎包含了所有类型。
这个问题关注的概念是与片段之间涉及的通信过程。因此,我已经阅读了文档,并且这不是我第一次尝试使用片段。
常识(和文档)告诉我们,如果片段想要与其活动进行对话或通信,则应使用接口。
示例:
TestFragment
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();
}
}
测试活动
public class Test implements TestFragmentInterface {
@Override
public void actionMethod() {
..
}
}
一切都很好。
这样做可以提高可重用性,因为我的TestFragment可以与任何实现我声明的接口的Activity进行交互。
反过来,Activity可以通过持有引用并调用其公共方法与Fragment进行交互。这也是建议的片段到片段通信方式,使用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中提供一个接口,并使TestFragment实现NestedFragmentInterface吗? 在这种情况下,我将采取以下措施:
NestedFragment
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作为片段之间桥梁的想法,我认为这是为了正确处理所有这些对象的生命周期。如果尝试手动处理系统可能抛出的异常,直接从片段到片段(使用接口或直接调用公共方法)是否仍然可行?