10

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()が呼び出されることはないため、これは役に立ちません。前)。

4

4 に答える 4

3

問題を投稿してから数日後に、問題の解決策を見つけました。遅くなってごめんなさい。

次のコードは私の問題を修正しました:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.remove("android:support:fragments");
}

フラグメントをインスタンス化して使用するアクティビティでそのコードを記述するのと同じくらい簡単です。

これがお役に立てば幸いです:)

于 2012-09-18T20:56:34.387 に答える
3

ViewPager内のFragmentのオプションメニューを膨らませる前に、Fragmentインスタンスが表示されているかどうかを確認して、メニュー項目の重複を防ぎます。

// This should be in your Fragment implementation
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
    if(isVisible())
    {
        inflater.inflate(R.menu.menu_fragment, menu);
    }
    super.onCreateOptionsMenu(menu, inflater);
}
于 2014-10-16T13:39:33.737 に答える
2

問題は、スワイプするたびにFragmentStatePagerAdapterが新しいフラグメントを作成することだと思います。その結果、作成されるフラグメントごとにonCreateOptionsMenu()が呼び出されます。

私が思うに、2つの解決策があります。

  1. フラグメントからアクションバーの操作を取り出します。フラグメント内のメニュー項目にonclickを設定する代わりに、アクティビティから現在のフラグメントにメッセージを送信します。

  2. Menu.findItem()を使用して、別のフラグメントが必要なMenuItemをすでに追加しているかどうかを確認し、追加されている場合は、現在のフラグメントを(onPrepareOptionsMenu()で)アタッチします。

于 2012-05-07T15:49:03.323 に答える
0

私はいくつかの解決策を見つけましたそれはうまくいくかもしれません

複製したメニューフラグメントmenu.clear() で、メニューファイルを膨らませる前に追加しますonCreateOptionsMenu(Menu menu, MenuInflater inflater)

@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        menu.clear();
        inflater.inflate(R.menu.main,menu);
    }
于 2015-03-27T05:43:35.280 に答える