From 919994e0ab76a9589a143faf1e0300af1534defe Mon Sep 17 00:00:00 2001 From: Christophe Beyls Date: Sun, 19 Jan 2014 01:17:37 +0100 Subject: [PATCH] Fragments option menus: keep a reference to MenuItems to change their state directly instead of recreating the whole menu (works fine with ActionBarCompat) --- .../fragments/BookmarksListFragment.java | 28 +++++++++++---- .../fragments/EventDetailsFragment.java | 34 ++++++++++++------- 2 files changed, 43 insertions(+), 19 deletions(-) diff --git a/src/be/digitalia/fosdem/fragments/BookmarksListFragment.java b/src/be/digitalia/fosdem/fragments/BookmarksListFragment.java index c3e4892..b917dca 100644 --- a/src/be/digitalia/fosdem/fragments/BookmarksListFragment.java +++ b/src/be/digitalia/fosdem/fragments/BookmarksListFragment.java @@ -6,7 +6,6 @@ import android.database.Cursor; import android.os.Build; import android.os.Bundle; import android.os.Handler; -import android.support.v4.app.FragmentActivity; import android.support.v4.app.ListFragment; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.Loader; @@ -37,6 +36,9 @@ public class BookmarksListFragment extends ListFragment implements LoaderCallbac private EventsAdapter adapter; private boolean upcomingOnly; + private MenuItem filterMenuItem; + private MenuItem upcomingOnlyMenuItem; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -66,8 +68,23 @@ public class BookmarksListFragment extends ListFragment implements LoaderCallbac @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.bookmarks, menu); - menu.findItem(R.id.filter).setIcon(upcomingOnly ? R.drawable.ic_action_filter_selected : R.drawable.ic_action_filter); - menu.findItem(R.id.upcoming_only).setChecked(upcomingOnly); + filterMenuItem = menu.findItem(R.id.filter); + upcomingOnlyMenuItem = menu.findItem(R.id.upcoming_only); + updateOptionsMenu(); + } + + private void updateOptionsMenu() { + if (filterMenuItem != null) { + filterMenuItem.setIcon(upcomingOnly ? R.drawable.ic_action_filter_selected : R.drawable.ic_action_filter); + upcomingOnlyMenuItem.setChecked(upcomingOnly); + } + } + + @Override + public void onDestroyOptionsMenu() { + super.onDestroyOptionsMenu(); + filterMenuItem = null; + upcomingOnlyMenuItem = null; } @Override @@ -75,9 +92,8 @@ public class BookmarksListFragment extends ListFragment implements LoaderCallbac switch (item.getItemId()) { case R.id.upcoming_only: upcomingOnly = !upcomingOnly; - FragmentActivity activity = getActivity(); - activity.supportInvalidateOptionsMenu(); - activity.getPreferences(Context.MODE_PRIVATE).edit().putBoolean(PREF_UPCOMING_ONLY, upcomingOnly).commit(); + updateOptionsMenu(); + getActivity().getPreferences(Context.MODE_PRIVATE).edit().putBoolean(PREF_UPCOMING_ONLY, upcomingOnly).commit(); getLoaderManager().restartLoader(BOOKMARKS_LOADER_ID, null, this); return true; } diff --git a/src/be/digitalia/fosdem/fragments/EventDetailsFragment.java b/src/be/digitalia/fosdem/fragments/EventDetailsFragment.java index 68b3a7c..e27496e 100644 --- a/src/be/digitalia/fosdem/fragments/EventDetailsFragment.java +++ b/src/be/digitalia/fosdem/fragments/EventDetailsFragment.java @@ -69,6 +69,8 @@ public class EventDetailsFragment extends Fragment { private ViewHolder holder; private boolean bookmarksChanged = false; + private MenuItem bookmarkMenuItem; + private final BroadcastReceiver bookmarksReceiver = new BroadcastReceiver() { @Override @@ -190,21 +192,27 @@ public class EventDetailsFragment extends Fragment { @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.event, menu); - ShareCompat.configureMenuItem(menu, R.id.share, getShareIntentBuilder()); + bookmarkMenuItem = menu.findItem(R.id.bookmark); + updateOptionsMenu(); + } - MenuItem item = menu.findItem(R.id.bookmark); - if (isBookmarked) { - item.setTitle(R.string.remove_bookmark); - item.setIcon(R.drawable.ic_action_important); - } else { - item.setTitle(R.string.add_bookmark); - item.setIcon(R.drawable.ic_action_not_important); + private void updateOptionsMenu() { + if (bookmarkMenuItem != null) { + if (isBookmarked) { + bookmarkMenuItem.setTitle(R.string.remove_bookmark); + bookmarkMenuItem.setIcon(R.drawable.ic_action_important); + } else { + bookmarkMenuItem.setTitle(R.string.add_bookmark); + bookmarkMenuItem.setIcon(R.drawable.ic_action_not_important); + } } } - private void invalidateOptionsMenu() { - getActivity().supportInvalidateOptionsMenu(); + @Override + public void onDestroyOptionsMenu() { + super.onDestroyOptionsMenu(); + bookmarkMenuItem = null; } @Override @@ -214,12 +222,12 @@ public class EventDetailsFragment extends Fragment { if (!isBookmarked) { if (DatabaseManager.getInstance().addBookmark(event)) { isBookmarked = true; - invalidateOptionsMenu(); + updateOptionsMenu(); } } else { if (DatabaseManager.getInstance().removeBookmark(event)) { isBookmarked = false; - invalidateOptionsMenu(); + updateOptionsMenu(); } } break; @@ -274,7 +282,7 @@ public class EventDetailsFragment extends Fragment { boolean result = DatabaseManager.getInstance().isBookmarked(event); if (result != isBookmarked) { isBookmarked = result; - invalidateOptionsMenu(); + updateOptionsMenu(); } bookmarksChanged = false; }