2

アプリの無料版と有料版を作成する必要があるため、一般的なアクティビティとリソースを含むライブラリプロジェクトを使用しています。ただし、これをどのように整理するのか疑問に思いました。

共有(ライブラリ)アクティビティMyActivity.javaは、ユーザーがボタンをクリックするとDialogFragmentを起動します。DialogFragmentは、無料アプリと有料アプリで異なります。無料アプリの場合は起動FreeDialog.javaし、有料アプリの場合は起動しPaidDialog.javaます。これらの2つのダイアログフラグメントは共有されていないため、ライブラリプロジェクトには含まれません。彼らは別々に無料と有料のプロジェクトに参加します。

私が考えることができる唯一のことは、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;
      }
   }
}

次に、無料および有料のアプリプロジェクトコードで、起動時に次のような呼び出しを発行します(メイン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 に答える