如何使用对详细信息活动的Fragment回调来避免代码重复



我使用的是主/细节模式,其中一个活动管理2-窗格视图和选择器列表,另一个活动则管理细节片段。我正在使用一个接口来处理对Activities的片段回调。

尽管details活动复制了2-pane活动中的许多回调方法,但似乎有很多代码重复。在适当的情况下,我使用了不需要上下文的静态方法,但在需要上下文的情况下我不确定如何巧妙地消除代码重复。

带有抽象父Activity的继承是一种选择,但似乎有很多开销。

有更好的方法吗?

我在这里问了一个类似的问题:有多少活动与碎片?

我也担心逻辑的重复,我得到的答案引起了一场相当健康的辩论。


最后,我选择遵循Stephen的答案,将尽可能多的逻辑放入Fragments本身。

然而,其他贡献者似乎非常热衷于根据这些例子复制逻辑。

假设你有控制碎片A和碎片B的活动AB。
我的回答:
如果变量由Frag A和Frag B使用,请将其放入活动AB中。然后将其传递给Frag A或Frag B他们需要的一切。或者让Frag A或者Frag B从活动AB中检索它。如果变量仅由Frag A或Frag B使用,则将其分别放在Frag A和Frag B中。

对于Frag A和Frag B都使用的方法,将这些方法放在另一个类中,并为要使用的2个片段中的每个片段在Frag A或Frag B中创建该类的实例。

以下是我给另一个人的答案。然而,这似乎与你的问题有关,所以我将其重新发布在这里
在片断A中,u需要一个活动AB可以实现的接口。在示例android代码中,他们有:

private Callbacks mCallbacks = sDummyCallbacks;

/*包含此片段的所有活动都必须实现的回调接口。此机制允许向活动通知项目选择。*/

public interface Callbacks {
/*Callback for when an item has been selected. */    
      public void onItemSelected(String id);
}
/*A dummy implementation of the {@link Callbacks} interface that does nothing. Used only when this fragment is not attached to an activity. */    
private static Callbacks sDummyCallbacks = new Callbacks() {
    @Override
    public void onItemSelected(String id) {
    }
};

回调接口放在您的一个片段(比如片段A)中。我认为这个回调接口的目的就像Frag a中的一个嵌套类,任何Activity都可以实现它。因此,如果片段A是一台电视,那么CallBacks就是允许活动AB使用片段A的电视遥控器(接口)。我可能对细节有错,因为我是一个傻瓜,但我确实让我的程序在所有屏幕尺寸上都能完美工作,这就是我使用的。

因此,在片段A中,我们有:(我从安卓的示例程序中获得)

@Override
public void onListItemClick(ListView listView, View view, int position, long id) {
super.onListItemClick(listView, view, position, id);
// Notify the active callbacks interface (the activity, if the
// fragment is attached to one) that an item has been selected.
mCallbacks.onItemSelected(DummyContent.ITEMS.get(position).id);
//mCallbacks.onItemSelected( PUT YOUR SHIT HERE. int, String, etc.);
//mCallbacks.onItemSelected (Object);
}

在活动AB中,我们覆盖onItemSelected方法:

public class AB extends FragmentActivity implements ItemListFragment.Callbacks {
//...
@Override
//public void onItemSelected (CATCH YOUR SHIT HERE) {
//public void onItemSelected (Object obj) {
    public void onItemSelected(String id) {
    //Pass Data to Fragment B. For example:
    Bundle arguments = new Bundle();
    arguments.putString(“FragmentB_package”, id);
    FragmentB fragment = new FragmentB();
    fragment.setArguments(arguments);
    getSupportFragmentManager().beginTransaction().replace(R.id.item_detail_container, fragment).commit();
    }

因此,在活动AB中,你基本上把所有东西都放入一个Bundle中,并把它传递给B。如果你不确定如何使用Bundle,请查找类。

我基本上是按照Android提供的示例代码进行操作的。那个有DummyContent的东西。当你制作一个新的Android应用程序包时,它就是名为MasterDetailFlow的。

最新更新