我需要创建一个免费且付费版本的应用程序,因此我使用的是具有常见活动和资源的库项目。但是我想知道如何组织这个:
当用户单击按钮时,共享(库)活动MyActivity.java
会启动DialogFragment。 DialogFragment对于免费和付费应用程序会有所不同。对于免费应用,我们将启动FreeDialog.java
,对于付费,我们将启动PaidDialog.java
。这两个对话框片段不在库项目中,因为它们不共享;他们将分别在免费和付费项目中。
我唯一能想到的就是将MyActivity.java
抽象化并将其扩展到免费和付费项目中。扩展将启动各自的DialogFragments。
另一种方法可能是在每个项目中重载Fragments。但是,我不确定这是否可行。
答案 0 :(得分:3)
理论上,你可以使MyActivity
抽象,并在付费和免费的应用程序项目中将其子类化。但是,Activity
类与普通的Java类略有不同,这使得复杂化。它们列在AndroidManifest.xml中,然后也不是通过 newing 创建的。它们通常是使用Intent
创建的。所以,我想我不会让Activity
成为一个抽象类。
我认为您真正想要的是使用类似于Factory pattern来创建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;
}
}
}
然后,在您的免费和付费应用程序项目代码中,您将在启动时发出这样的调用(例如在主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();