有人可以告诉我,我是否正确地解决了这个问题,或者我是否应该走另一条路?
这是一个简化的例子:我有1个活动和2个碎片。每个片段都有一个按钮,单击该按钮,将单击转发回活动,并在活动中弹出一个Toast。
我知道Fragment通过接口与Activity通信。但是如果我有多个具有类似接口的片段呢?例如,这里两个Fragments都使用onClick类型的接口与Activity
进行通信 static interface OnClickedListener{
public void buttonClicked(View v);
}
更好吗?
A)创建一个单独的Interface类并将其附加到两个Fragments中。例如片段1:
public class Fragment1 extends Fragment implements OnClickedListener{
private OnClickedListener clickedInterface;
public Fragment1() {
// Required empty public constructor
}
@Override
public void buttonClicked(View v) {
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
this.clickedInterface = (OnClickedListener)activity;
}}
片段2:
public class Fragment2 extends Fragment implements OnClickedListener{
private OnClickedListener clickedInterface;
public Fragment2() {
// Required empty public constructor
}
@Override
public void buttonClicked(View v) {
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
this.clickedInterface = (OnClickedListener)activity;
}
OR
B)创建特定片段独有的各个接口,并在MainActivity中实现它们,而不是像上面提到的那样一个接口。谢谢。
答案 0 :(得分:5)
首先创建实现界面中的自定义片段。
public class CustomFragment extends Fragment implements OnClickedListener{
public OnClickedListener clickedInterface;
@Override
public void buttonClicked(View v) {
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
this.clickedInterface = (OnClickedListener)activity;
}
}
现在,您可以添加每个片段
(i)片段1
public class Fragment1 extends CustomFragment {
......
}
(ii)片段2
public class Fragment2 extends CustomFragment {
......
}
答案 1 :(得分:0)
我不会让View
中包含的任何Fragment
的详细信息泄露到Activity
。
更好的界面将基于按下按钮所涉及的语义操作,例如createThing()
或deleteThing()
。
Activity
真的不在乎View
被点击以启动行动,只是需要采取行动。如果将按钮移动到菜单,或者与View
无关的其他位置,则会发生接口。
如果你创建这样的界面,那么为不同的Fragment
创建副本的问题就会消失。
答案 2 :(得分:0)
有一个名为SOLID的代码主体。 " I" File System core module的状态。
是一个很好的做法您不应该创建通用接口或大型接口,您需要创建可以“可读”的接口。并且"可以理解"适用于所有人的接口名称及其方法名称,如"articleSelected
"或"loginProcessing(String loginName)"
等