3

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

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

使用抽象父 Activity 继承是一种选择,但似乎开销很大。

有没有更好的方法来做到这一点?

4

2 回答 2

0

因此,假设您有控制 Frag A 和 Fragment B 的 Activity AB。
我的答案:
如果 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 都使用的方法,将这些方法放在另一个类中,并在 Frag A 和 Frag B 中为要使用的 2 个片段中的每一个创建该类的实例。

以下是我给另一个人的答案。但是,这似乎与您的问题有关,因此我在此处重新发布。
在 Fragment A 内部,您需要一个 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) {
    }
};

回调接口放在您的一个片段(假设片段 A)中。我认为这个 Callbacks 接口的目的就像 Frag A 中的一个嵌套类,任何 Activity 都可以实现。因此,如果 Fragment A 是电视,则 CallBacks 是允许 Activity AB 使用 Fragment A 的 TV Remote(接口)。我可能对细节有误,因为我是菜鸟,但我确实让我的程序在所有屏幕尺寸上都能完美运行,这就是我使用的。

所以在片段 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。

于 2013-02-20T15:08:29.733 回答
0

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

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


最后,我选择遵循斯蒂芬的回答,将尽可能多的逻辑放入Fragments自身中。

然而,其他贡献者似乎非常热衷于按照示例复制逻辑。

于 2013-02-20T11:33:01.567 回答