2

我需要创建一个免费和付费版本的应用程序,因此我正在使用一个包含常见活动和资源的库项目。但是我想知道你将如何组织这个:

当用户单击按钮时,共享(库)活动MyActivity.java会启动 DialogFragment。免费和付费应用程序的 DialogFragment 会有所不同。对于我们将推出的免费应用程序,我们将推出FreeDialog.java付费应用程序PaidDialog.java。这两个对话框片段不会在库项目中,因为它们不是共享的;他们将分别在免费和付费项目中。

我唯一能想到的就是MyActivity.java抽象化并在免费和付费项目中扩展它。扩展将启动它们各自的 DialogFragments。

另一种方法可能是在每个项目中重载片段。但是,我不确定这是否可能。

4

1 回答 1

3

从理论上讲,您可以MyActivity在付费和免费应用程序项目中进行抽象并将其子类化。但是,Activity类与普通的 Java 类有点不同,这使这变得复杂。它们在 AndroidManifest.xml 中列出,然后也不是通过简单地更新它们来创建的。它们通常是用Intents 创建的。所以,我想我会远离创建Activity一个抽象类。

我认为您真正想要的是使用类似于工厂模式的东西来创建 的实例DialogFragment,而您的公共库不知道DialogFragment将创建哪个实例。您可以对工厂非常感兴趣,并且可以在其他地方阅读所有相关信息,但一个简单的可能对您有用:

public class FragmentFactory {

   private static String _dialogFragmentClassName;

   public static void registerFragment(String className) {
      // you might choose to assert if _dialogFragmentClassName != null
      _dialogFragmentClassName = className;
   }

   public static DialogFragment createFragment() {
      try {
         return (DialogFragment) Class.forName(_dialogFragmentClassName).newInstance();
      } catch (Exception e) {
         return null;
      }
   }
}

然后,在您的免费和付费应用项目代码中,您将在启动时发出这样的调用(例如在 main 中Activity):

FragmentFactory.registerFragment(com.mycompany.free.FreeDialogFragment.class.getName());

FragmentFactory.registerFragment(com.mycompany.paid.PaidDialogFragment.class.getName());

最后,在通用库代码中,可以通过调用来创建片段的实例

DialogFragment fragment = FragmentFactory.createFragment();
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.fragment_content, fragment);
ft.commit(); 
于 2012-06-24T12:09:33.417 回答