package org.holoeverywhere.demo.fragments.menus; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; import android.support.v7.widget.PopupMenu; import android.util.SparseBooleanArray; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.MenuItem.OnMenuItemClickListener; import android.view.View; import org.holoeverywhere.demo.R; import org.holoeverywhere.demo.fragments.OtherFragment; public class MenusFragments extends OtherFragment { private static final int[] CHECKBOXS = { R.id.item4, R.id.item5 }; private static final String KEY_MENU_STATE = "menuState"; private static final int[] RADIOS = { R.id.item1, R.id.item2 }; private OnOtherItemClickListener mContextMenuListener = new OnOtherItemClickListener() { @Override public void onClick(OtherItem otherItem) { final View view = otherItem.lastView; registerForContextMenu(view); openContextMenu(view); unregisterForContextMenu(view); } }; private MenuHelper mDemoMenuHelper; @Override protected CharSequence getTitle() { return "Menus"; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { mDemoMenuHelper = savedInstanceState.getParcelable(KEY_MENU_STATE); } if (mDemoMenuHelper == null) { mDemoMenuHelper = new MenuHelper(); } mDemoMenuHelper.setFragment(this); setHasOptionsMenu(true); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { mDemoMenuHelper.makeMenu(menu, getMenuInflater()); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { mDemoMenuHelper.makeMenu(menu, inflater); } @Override protected void onHandleData() { addItem("PopupMenu", new OnOtherItemClickListener() { @Override public void onClick(OtherItem otherItem) { PopupMenu menu = new PopupMenu(getSupportActivity(), otherItem.lastView); mDemoMenuHelper.makeMenu(menu.getMenu(), getMenuInflater()); menu.show(); } }); addItem("ContextMenu", mContextMenuListener); addItemWithLongClick("ContextMenu (long click)", mContextMenuListener); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable(KEY_MENU_STATE, mDemoMenuHelper); } public static class MenuHelper implements Parcelable { public static final Creator<MenuHelper> CREATOR = new Creator<MenuHelper>() { @Override public MenuHelper createFromParcel(Parcel source) { return new MenuHelper(source); } @Override public MenuHelper[] newArray(int size) { return new MenuHelper[size]; } }; private final OnMenuItemClickListener mOnMenuItemClickListener = new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem menuItem) { boolean result = false; final int id = menuItem.getItemId(); for (int i : RADIOS) { if (i == id) { mRadioState = id; result = true; } } for (int i : CHECKBOXS) { if (i == id) { mCheckboxsState.put(id, !mCheckboxsState.get(id, false)); result = true; } } if (result && mFragment != null) { mFragment.getSupportActivity().supportInvalidateOptionsMenu(); } return result; } }; private SparseBooleanArray mCheckboxsState = new SparseBooleanArray(CHECKBOXS.length); private MenusFragments mFragment; private int mRadioState = RADIOS[0]; public MenuHelper() { } protected MenuHelper(Parcel source) { mCheckboxsState = source.readSparseBooleanArray(); mRadioState = source.readInt(); } @Override public int describeContents() { return 0; } public void makeMenu(Menu menu, MenuInflater inflater) { if (menu instanceof ContextMenu) { ((ContextMenu) menu).setHeaderTitle("Context menu title"); } menu.clear(); inflater.inflate(R.menu.menu, menu); for (int i = 0; i < menu.size(); i++) { menu.getItem(i).setOnMenuItemClickListener(mOnMenuItemClickListener); } menu.findItem(mRadioState).setChecked(true); for (int i : CHECKBOXS) { menu.findItem(i).setChecked(mCheckboxsState.get(i, false)); } } public void setFragment(MenusFragments fragment) { mFragment = fragment; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeSparseBooleanArray(mCheckboxsState); dest.writeInt(mRadioState); } } }