FragmentStatePageAdapter(ViewPagerのアダプターとして使用)とアクションバーのメニュー項目に問題があります。
アプリケーションを起動すると、すべて問題ありません。タスクをバックグラウンドに移動し(たとえば、HOMEボタンを押す)、アクティビティが終了するまで作業を開始した場合、アプリケーションに戻ると(ランチャーまたは作成した通知を介して)、次の場合を除いてすべて問題ありません。アクションバーのメニュー項目が重複しています。
重要な詳細は、重複するアイテムは、ViewPagerで使用する各フラグメントのonCreateOptionsMenu()で作成されるアイテムだけであるということです。
FragmentStatePageAdapterをFragmentPageAdapterに置き換えると、アイテムは複製されなくなりますが、フラグメントはViewPagerに表示されません(アダプターからのgetItem()関数は呼び出されないため、フラグメントは返されません)。
何か案は?FragmentStatePageAdapterがメニュー項目を複製しないようにする方法は?たぶんFragmentPageAdapterを使用しますが、フラグメントを表示するように変更しますか?私のフラグメントの変更?
これが私のアプリケーションからのいくつかのコードスニペットです...
フラグメント内でメニュー項目が作成される方法:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
/* Create play button */
final MenuItem mPlay = menu.add(R.string.play_all);
mPlay.setIcon(R.drawable.ic_play_all);
mPlay.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
mPlay.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
final List<Song> songs = getSongs();
if (songs.size() == 0) {
/* Show message */
Toast.makeText(mContext, R.string.no_song_list, Toast.LENGTH_LONG).show();
} else {
/* Play song list */
try { PlayManager.getService().playList(songs); } catch (Exception e) {}
}
return false;
}
});
/* Create menu */
super.onCreateOptionsMenu(menu, inflater);
}
ViewPagerアダプタでフラグメントがインスタンス化される方法
@Override
public Fragment getItem(int position) {
final Class<?> cls = mTabs.get(position);
/* No tab */
if (cls == null)
return null;
/* Instantiate fragment */
final Fragment fragment = Fragment.instantiate(mContext, cls.getName(), null);
/* Add to list */
mFragments.put(position, fragment);
/* Return fragment */
return fragment;
}
ありがとう!
PS:アクティビティのlaunchModeを "singleTop"に変更しようとしました。また、以前に作成したフラグメントをgetItem()に戻そうとしました(ただし、アプリケーションに戻ったときにgetItem()が呼び出されることはないため、これは役に立ちません。前)。