我正在使用主/细节模式,其中一个活动管理 2 窗格视图和选择器列表,另一个活动管理细节片段。我正在使用一个接口来处理对活动的片段回调。
尽管细节活动从 2 窗格活动中复制了许多回调方法,但似乎有很多代码重复。在适当的情况下,我使用了不需要上下文的静态方法,但在需要上下文的地方,我不确定如何巧妙地删除代码重复。
使用抽象父 Activity 继承是一种选择,但似乎开销很大。
有没有更好的方法来做到这一点?
我正在使用主/细节模式,其中一个活动管理 2 窗格视图和选择器列表,另一个活动管理细节片段。我正在使用一个接口来处理对活动的片段回调。
尽管细节活动从 2 窗格活动中复制了许多回调方法,但似乎有很多代码重复。在适当的情况下,我使用了不需要上下文的静态方法,但在需要上下文的地方,我不确定如何巧妙地删除代码重复。
使用抽象父 Activity 继承是一种选择,但似乎开销很大。
有没有更好的方法来做到这一点?
因此,假设您有控制 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。