web-dev-qa-db-ja.com

Android:フラグメントが変更されたときにアクションバーを再作成する方法

いくつかのフラグメントを示すアクティビティがあります。アクティビティビューには、カスタムFragmentPagerAdapterで初期化されたViewPagerのみが含まれます。このアダプターは、3つのフラグメント間のナビゲーションを提供します。

アクションバー以外はすべて正常に動作しているようです。

フラグメントのonCreateOptionsMenu()メソッドをオーバーライドして、フラグメントの個々のアクションバーを作成します。

 @Override 
 public void onCreateOptionsMenu(Menu menu、MenuInflater inflater)
 {
 super.onCreateOptionsMenu(menu、inflater); 
 menu.clear (); 
 
         //fragment specific menu creation
    }

スワイプすると、新しいフラグメントが表示されますが、アクションバーは数秒間同じままです。おそらく数秒後にこのメソッドが呼び出され、アクションバーが変更されます。

これは、スワイプが完了してからしばらくしてアクションバーが変更された場合、かなり悪く見えます。スワイプを開始する前に、すぐにアクションバーを再作成するにはどうすればよいですか?

24
mc.dev

invalidateOptionsMenu();を呼び出すことで、自動的に行う前にAndroid=アクションバーを再作成するように依頼できます

フラグメントを変更するポイントの近くでこれを行い、フラグメントとアクションバーの変更の間の「遅れ」を減らします。

編集

完全なソリューションは次のようになります。

class activity extends Activity{

private void switchFragment(){

...do fragment changing stuff

activity.invalidateOptionsMenu();

}

}

class someFragment extends Fragment{

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
    super.onCreateOptionsMenu(menu, inflater);
    menu.clear();


    //fragment specific menu creation
}

}

どのフラグメントが

activity.invalidateOptionsMenu();

その後、そのを呼び出します

 onCreateOptionsMenu

そこに特定のメニューを作成することができます

26
roarster

これは、onCreateOptionsMenuを実装し、各フラグメントのonAttachコールバックでsetHasOptionsMenu(true)を呼び出すことで実行でき、それに応じてアクションを変更します。

アクションなしでフラグメントを表示するにはsetHasOptionsMenu(false)

4
Kumait

ActionBarタブを使用している場合は、次の回答をご覧ください。

アクションバーのアクションを動的に変更するにはどうすればよいですか?

2
David

最後に、これを達成するための適切な方法を見つけることができませんでした。

最善の方法は、アクションバーをアクティビティではなくフラグメントの一部にすることですが、それは不可能です。

スワイプが始まるとアクションバーのメニューとタイトルを消去し(PageViewで特別なリスナーを設定できます)、スワイプが完了して新しいフラグメントが表示されたらメニューとタイトルを再設定します。

でタイムラグが発生し、スワイプ中にアクションバーが奇妙に空に見えますが、できる限り最善です。
Android APIは...

1
mc.dev