9

好的,所以我有FavoritesList 扩展GalleryList 扩展ListFragment:

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);
        }
    }
}

这是问题所在:在加载此 Fragment 时,在 onCreate(我初始化 listAdapter)之前调用了 onPrepareOptionsMenu,并且在第一次显示选项菜单之前不会再次调用它!

Fragment 文档声称 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 是否为空,这将在某些手机上中断。我应该意识到的。

于 2012-09-11T17:39:04.017 回答