Android4.0(以降ICS)ではメニューを再描画させるためのメソッド"invalidateOptionsMenu"がFragmentManagerクラスに追加されました。
  このinvalidateOptionsMenuメソッドはActivityクラスではAndroid3.0(API   level11)から追加されていますが、Fragmentからメニューの再描画を促したい場合はFragmentManager#invalidateOptionsMenuを使用することが必須となっています。
  このinvalidateOptionsMenuメソッドを使用することで動的にメニューのレイアウトを変更することが可能になります。
    invalidateOptionsMenuメソッドの詳細は以下から。
  
  invalidateOptionsMenuを使用したメニューのレイアウトの変更方法
  invalidateOptionsMenuメソッドが呼び出されるとActivityクラスのonCreateOptionsMenuメソッドが呼ばれます。
  メニューのレイアウトを変更したい場合はメニューのレイアウトのバリエーションをメニューのレイアウトファイルに定義しておいて、メニューのレイアウトを管理する変数を用意し、onCreateOptionsMenuメソッドではレイアウト管理用の変数ごとに読み込むメニューのレイアウトファイルを変更する実装がシンプルでコードの可読性も上がります。
  下記のサンプルはmMenuTypeというメニューのレイアウト管理用変数を用意して、その中身の状態によって読み込むメニューのレイアウトファイルを切り替えています。
  InvalidateOptionsMenuSampleActivity.java
                    | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |         /**
  * メニューレイアウト管理用変数
  */
 publicstaticintmMenuType = 1;
 /**
  * メニューのレイアウトファイルmenu_aを表す
  */
 publicstaticfinalintMENU_TYPE_A = 1;
 /**
  * メニューのレイアウトファイルmenu_bを表す
  */
 publicstaticfinalintMENU_TYPE_B = 2;
     
 @Override
 publicvoidonCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);
         
     Button btn = (Button)         findViewById(R.id.change_menu_button);
     btn.setOnClickListener(this);
 }
     
 @Override
 publicbooleanonCreateOptionsMenu(Menu menu) {
     
     switch(mMenuType) {
         caseMENU_TYPE_A:
             getMenuInflater().inflate(R.menu.menu_a,         menu);
             break;
         caseMENU_TYPE_B:
             getMenuInflater().inflate(R.menu.menu_b,         menu);
             break;
         default:
         break;
     }
         
     returnsuper.onCreateOptionsMenu(menu);
 }
 | 
    メニューのレイアウトを切り替える仕組みができたところで、実際にFragmentからメニューを更新してみましょう。
  まず、InvalidateOptionsMenuSampleActivity.javaにFragmentをコミットするための処理を追加します。
  下記のコードでは画面内のボタンが押下される度にFragmentがコミットされます。
  InvalidateOptionsMenuSampleActivity.java
                    | 1 2 3 4 5 6 7 |         publicvoidonClick(View v) {
     
     InvalidateOptionsMenuFragment fragment = newInvalidateOptionsMenuFragment();
     FragmentTransaction ft =         getFragmentManager().beginTransaction();
     ft.add(R.id.sample_fragment, fragment);
     ft.commit();
 }
 | 
    次にInvalidateOptionsMenuFragmentのコードを下記に記述します。
  このFragmentはonResumeが呼ばれる度に親Activityのメニューレイアウト管理用変数を変更し、メニューの再描画を行います。
  InvalidateOptionsMenuFragment.java
                    | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |         publicclassInvalidateOptionsMenuFragment extendsFragment{
     
     publicInvalidateOptionsMenuFragment() {
     }
     
     @Override
     publicvoidonResume() {
         super.onResume();
         
         
         switch(InvalidateOptionsMenuSampleActivity.mMenuType)         {
         caseInvalidateOptionsMenuSampleActivity.MENU_TYPE_A:
             InvalidateOptionsMenuSampleActivity.mMenuType =         InvalidateOptionsMenuSampleActivity.MENU_TYPE_B;
             break;
         caseInvalidateOptionsMenuSampleActivity.MENU_TYPE_B:
             InvalidateOptionsMenuSampleActivity.mMenuType =         InvalidateOptionsMenuSampleActivity.MENU_TYPE_A;
             break;
         default:
             break;
         }
         getFragmentManager().invalidateOptionsMenu();
     }
 }
 | 
    21行目でFragmentManager#invalidateOptionsMenuメソッドを使用して、親Activityのメニューを再描画しています。
 
0 件のコメント:
コメントを投稿