我正在使用主/详细模式,其中一个活动管理2窗格视图和选择器列表,另一个活动管理详细信息片段。我正在使用一个接口来处理活动的片段回调。
虽然详细信息活动从双窗格活动中复制了许多回调方法,但似乎有很多代码重复。在适当的情况下,我使用了静态方法,其中不需要上下文,但在需要上下文的地方,我不确定如何整齐地删除代码重复。
使用抽象父活动进行继承是一个选项,但似乎需要很多开销。
有更好的方法吗?
答案 0 :(得分:0)
我在这里问了一个类似的问题:How many Activities vs Fragments?
我也担心逻辑重复,我得到的答案引起了一场非常健康的辩论。
最后,我选择关注Stephen's answer,将尽可能多的逻辑放入Fragments
本身。
然而,其他贡献者似乎非常热衷于根据示例重复逻辑。
答案 1 :(得分:0)
所以假设你有活动AB来控制Frag A和Fragment B.
我的答案:
如果Frag A和Frag B使用该变量,请将其放入Activity AB中。然后将它传递给Frag A或Frag B他们需要的一切。或者让Frag A或Frag B从Activity AB中检索它。
如果变量仅由Frag A使用或仅由Frag B使用,则分别将其放入Frag A或Frag B中。
对于Frag A和Frag B使用的方法,将这些方法放在另一个类中,并为要使用的2个片段中的每个片段在Frag A和Frag B中创建该类的实例。
以下是我给另一个人的答案。但是,它似乎与你的问题有关,所以我在这里重新发布。
Inside Fragment你需要一个Activity 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) {
}
};
Callback接口放在你的一个片段中(让我们说片段A)。我认为这个Callbacks接口的目的就像Frag A中的嵌套类,任何Activity都可以实现。因此,如果片段A是电视,则CallBacks是允许片段A被活动AB使用的电视遥控器(接口)。我可能错了细节,因为我是一个菜鸟,但我确实让我的程序在所有屏幕尺寸上完美运行,这就是我使用的。
因此在Fragment A中,我们有: (我从Android的示例程序中获取了这个)
@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);
}
在Activity 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();
}
因此,在Activity AB中,你基本上把所有东西都扔进了Bundle并将它传递给B.如果你不确定如何使用Bundle,请查看该类。
我基本上按照Android提供的示例代码进行操作。带有DummyContent的东西。当你制作新的Android应用程序包时,它就是名为MasterDetailFlow的那个。