多个片段的一个界面

时间:2016-01-16 13:38:25

标签: android android-fragments

有人可以告诉我,我是否正确地解决了这个问题,或者我是否应该走另一条路?

这是一个简化的例子:我有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中实现它们,而不是像上面提到的那样一个接口。谢谢。

3 个答案:

答案 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)"