9

さて、ListFragmentを拡張するGalleryListを拡張するFavoritesListがあります。

public static class FavoritesList extends GalleryList {

    public static FavoritesList newInstance(int page) {
        FavoritesList list = new FavoritesList();

        Bundle args = new Bundle();
        args.putInt("page", page);
        list.setArguments(args);

        return list;
    }

    @Override
    public void onCreate(Bundle saveInstanceState) {
        super.onCreate(saveInstanceState);

        Cursor cursor = dbHelper.getGalleries(fav, preferences.getString("sort"+fav, "date desc"));
        listAdapter = new GalleryListAdapter(activity, cursor);
        setListAdapter(listAdapter);
    }

    ...

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        menu.add(Menu.NONE, 0, 8, "Remove All");
    }

    @Override
    public void onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);

        //listAdapter is null the first time this is called...

        if (listAdapter != null && listlistAdapter.getCount() == 0) {
            menu.findItem(R.id.filter).setEnabled(false);
            menu.findItem(0).setEnabled(false);
        }
        else {
            menu.findItem(R.id.filter).setEnabled(true);
            menu.findItem(0).setEnabled(true);
        }
    }
}

問題は次のとおりです。onPrepareOptionsMenuは、このフラグメントをロードするときにonCreate(listAdapterを初期化する場所)の前に呼び出され、オプションメニューが初めて表示される前に再度呼び出されることありません。

onPrepareOptionsMenuが「メニューが表示される直前に、表示されるたびに呼び出される」と主張する場合、フラグメントのドキュメントは単純に間違っています。

ps Androidサポートライブラリ(v4)を使用しています。何か案は?

4

2 に答える 2

2

を呼び出しinvalidateOptionsMenu()てみてくださいonCreate()nullリストアダプタがオンになっているかどうかを必ず確認してくださいonPrepareOptionsMenu()

于 2012-09-11T17:28:50.167 に答える
2

したがって、これはばかげていますが、機能する回避策は次のとおりです。

public static class FavoritesList extends GalleryList {

    Menu optionsMenu;

    ...

    @Override
    public void onCreate(Bundle saveInstanceState) {
        super.onCreate(saveInstanceState);

        Cursor cursor = dbHelper.getGalleries(fav, preferences.getString("sort"+fav, "date desc"));
        listAdapter = new GalleryListAdapter(activity, cursor);
        setListAdapter(listAdapter);

        if (optionsMenu != null) {
            onPrepareOptionsMenu(optionsMenu);
        }
    }

    ...

    @Override
    public void onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);

        optionsMenu = menu;

        if (listAdapter != null && listAdapter.getCount() == 0) {
            menu.findItem(R.id.filter).setEnabled(false);
            menu.findItem(0).setEnabled(false);
        }
        else {
            menu.findItem(R.id.filter).setEnabled(true);
            menu.findItem(0).setEnabled(true);
        }
    }
}

基本的に、onPrepareOptionsMenuの最初の実行中にオプションメニューを取得し、listAdapterが初期化されたら再度呼び出しました。

編集:明らかにoptionsMenuがnullかどうかをチェックせずに、これは特定の電話で壊れます。気づいたはずです。

于 2012-09-11T17:39:04.017 に答える