2012-03-19 9 views
1

いくつかのアプリケーションでは、アプリケーション内のすべてのアクティビティまたはほとんどのアクティビティにグローバル機能を追加する必要がある場合がありますメニューを使用して環境設定アクティビティーを起動するか、グローバルナビゲーションバーを扱う機能を追加します)。私は、Activity、ListActivites、TabActiviesなどに最小限のコード複製で同じ機能を追加する必要があることに対処するために、以下のようなものを作成することに取り掛かりましたが、コードの厄介な量があります。それ以外の場合は、すべてのアクティビティ、およびのサブクラスにコールを追加することなく、すべての画面に機能を追加することができます。誰かがより良いアプローチを提案できますか?Activity、ListActivity、TabActivityなどにグローバル機能を追加する

public class CoreBaseActivity { 

    /** 
    * Used in options menu to launch preferences activity 
    */ 
    public final static int MENU_PREFERENCES = 0x00; 

    public static boolean onCreateOptionsMenu(Menu menu, Context context) { 
     menu.add(0, MENU_PREFERENCES, 0, context.getString(R.string.preferences)); 
     return true; 
    } 

    private static boolean onOptionsItemSelected(MenuItem item, Context context) { 
     switch (item.getItemId()) { 
      case MENU_PREFERENCES: 
       //launch preference activity 
       break; 
     } 
     return true; 
    } 

    public static void overrideTransition(Activity activity) { 
     activity.overridePendingTransition(0, R.anim.fade_out); 
    } 


    public static void initGlobalNav(final Activity activity) { 
     if (activity.findViewById(R.id.footer_bar) != null) { 
      // add global nav button click listeners 
     } 
    } 

    public static class BaseActivity extends Activity { 

     protected Context mContext; 
     protected AppState mAppState; 

     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      mContext = getApplicationContext(); 
      mAppState = (AppState) getApplication(); 

     } 

     @Override 
     public void setContentView(int layoutResID) { 
      super.setContentView(layoutResID); 
      CoreBaseActivity.initGlobalNav(this); 
     } 

     @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 
      return CoreBaseActivity.onCreateOptionsMenu(menu, mContext); 
     } 

     @Override 
     public boolean onOptionsItemSelected(MenuItem item) { 
      return CoreBaseActivity.onOptionsItemSelected(item, mContext); 
     } 

     @Override 
     public void startActivity(Intent intent) { 
      CoreBaseActivity.overrideTransition(this); 
      super.startActivity(intent); 
     } 

     public void startActivityNoTransition(Intent intent) { 
      super.startActivity(intent); 
     } 
     @Override 
     public void onPause() { 
      CoreBaseActivity.overrideTransition(this); 
      super.onPause(); 
     } 
    } 

    public static class BaseListActivity extends ListActivity { 

     protected Context mContext; 
     protected AppState mAppState; 

     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      mContext = getApplicationContext(); 
      mAppState = (AppState) getApplication(); 
     } 

     @Override 
     public void setContentView(int layoutResID) { 
      super.setContentView(layoutResID); 
      CoreBaseActivity.initGlobalNav(this); 
     } 

     @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 
      return CoreBaseActivity.onCreateOptionsMenu(menu, mContext); 
     } 

     @Override 
     public boolean onOptionsItemSelected(MenuItem item) { 
      return CoreBaseActivity.onOptionsItemSelected(item, mContext); 
     } 

     @Override 
     public void startActivity(Intent intent) { 
      CoreBaseActivity.overrideTransition(this); 
      super.startActivity(intent); 
     } 
     public void startActivityNoTransition(Intent intent) { 
      super.startActivity(intent); 
     } 

     @Override 
     public void onPause() { 
      CoreBaseActivity.overrideTransition(this); 
      super.onPause(); 
     } 
    } 

    public static class BaseTabActivity extends TabActivity { 

     protected Context mContext; 
     protected AppState mAppState; 

     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      mContext = getApplicationContext(); 
      mAppState = (AppState) getApplication(); 
     } 

     @Override 
     public void setContentView(int layoutResID) { 
      super.setContentView(layoutResID); 
      CoreBaseActivity.initGlobalNav(this); 
     } 

     @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 
      return CoreBaseActivity.onCreateOptionsMenu(menu, mContext); 
     } 

     @Override 
     public boolean onOptionsItemSelected(MenuItem item) { 
      return CoreBaseActivity.onOptionsItemSelected(item, mContext); 
     } 

     @Override 
     public void startActivity(Intent intent) { 
      CoreBaseActivity.overrideTransition(this); 
      super.startActivity(intent); 
     } 
     public void startActivityNoTransition(Intent intent) { 
      super.startActivity(intent); 
     } 
     @Override 
     public void onPause() { 
      CoreBaseActivity.overrideTransition(this); 
      super.onPause(); 
     } 
    } 
} 

答えて

0

私が通常使用するアプローチは、ただ1つのBaseActivityを作成することです。アクティビティの種類ごとにBaseActivityを作成することは、過度の傾向にあります。このアプローチの否定はおそらく過剰なコードです。特に、アクティビティでは基本アクティビティのほとんどの機能は必要ありません。

これにより、上で使用したように静的な使用も可能です。

+0

うわー - これを行うにはいい方法がないようです。 – Martyn

0

2つの方法があります。最初の方法は、行った方法と似ています。すべてのアクションを処理するユーティリティクラスを作成します。

2番目の方法は、アクティビティを作成してすべての機能を実装する方法です。他の活動もこれを拡張します。例えば。スーパークラスからonOptionsItemSelected関数を拡張するのは非常に簡単です。 2番目のアプローチには、通常のActivityとListActivityのヘルパーアクティビティが必要であるという欠点があります。

関連する問題