PopupMenuActivity.java revision 1c61830acebd4233b170dc0f30f1d652fe9cb3af
199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov/* 299046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov * Copyright (C) 2016 The Android Open Source Project 399046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov * 499046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov * Licensed under the Apache License, Version 2.0 (the "License"); 599046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov * you may not use this file except in compliance with the License. 699046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov * You may obtain a copy of the License at 799046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov * 899046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov * http://www.apache.org/licenses/LICENSE-2.0 999046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov * 1099046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov * Unless required by applicable law or agreed to in writing, software 1199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov * distributed under the License is distributed on an "AS IS" BASIS, 1299046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1399046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov * See the License for the specific language governing permissions and 1499046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov * limitations under the License. 1599046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov */ 1699046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov 1799046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovpackage com.example.android.supportv7.widget; 1899046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov 1999046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport android.os.Bundle; 201c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheevimport android.support.v4.view.MenuCompat; 217ed1d9e48e54df2c98b6405e0996a3e97490b2bdVladislav Kaznacheevimport android.support.v4.view.MenuItemCompat; 2299046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport android.support.v7.app.AppCompatActivity; 2399046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport android.support.v7.widget.PopupMenu; 24e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikovimport android.support.v7.widget.SwitchCompat; 251c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheevimport android.view.ContextMenu; 26e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikovimport android.view.Gravity; 271c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheevimport android.view.Menu; 2899046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport android.view.MenuInflater; 2999046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport android.view.MenuItem; 3099046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport android.view.View; 3199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport android.view.ViewGroup; 3299046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport android.widget.Button; 3399046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport android.widget.TextView; 34e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov 3599046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport com.example.android.supportv7.R; 3699046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov 3799046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport java.text.SimpleDateFormat; 3899046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport java.util.Date; 3999046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov 4099046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovpublic class PopupMenuActivity extends AppCompatActivity { 4199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov private TextView mLog; 4299046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov 4399046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov private SimpleDateFormat mDateFormat; 4499046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov 4599046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov @Override 4699046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov protected void onCreate(Bundle savedInstanceState) { 4799046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov super.onCreate(savedInstanceState); 4899046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov 4999046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov setContentView(R.layout.popup_menu_activity); 5099046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov 5199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov mDateFormat = new SimpleDateFormat("HH:mm:ss.SSS"); 5299046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov 53fa2e2acf79d791a90410025daad438968550d18cAlan Viverette final ViewGroup container = findViewById(R.id.container); 54e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov mLog = (TextView) container.findViewById(R.id.log); 5599046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov 56e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov final SwitchCompat elevationToggle = (SwitchCompat) container.findViewById( 57e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov R.id.elevation_toggle); 58e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov final Button button = (Button) container.findViewById(R.id.test_button); 59e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov button.setOnClickListener(new View.OnClickListener() { 6099046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov @Override 6199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov public void onClick(View v) { 62e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov // Do we need to use a custom style that removes elevation? 63e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov boolean useDefaultElevation = elevationToggle.isChecked(); 64e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov 65e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov PopupMenu popupMenu = null; 66e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov if (useDefaultElevation) { 67e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov popupMenu = new PopupMenu(container.getContext(), button); 68e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov } else { 69e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov popupMenu = new PopupMenu(container.getContext(), button, Gravity.NO_GRAVITY, 70e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov 0, R.style.CustomPopupNoElevation); 71e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov } 72d62480d95d027a2fb473fd68039ab73c6fbf8c7eKirill Grouchnikov 73e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov final MenuInflater menuInflater = popupMenu.getMenuInflater(); 741c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev populateMenu(menuInflater, popupMenu.getMenu()); 75d62480d95d027a2fb473fd68039ab73c6fbf8c7eKirill Grouchnikov final MenuItem editItem = popupMenu.getMenu().findItem(R.id.action_edit); 767ed1d9e48e54df2c98b6405e0996a3e97490b2bdVladislav Kaznacheev MenuItemCompat.setContentDescription(editItem, 777ed1d9e48e54df2c98b6405e0996a3e97490b2bdVladislav Kaznacheev getString(R.string.popup_menu_edit_description)); 787ed1d9e48e54df2c98b6405e0996a3e97490b2bdVladislav Kaznacheev MenuItemCompat.setTooltipText(editItem, 797ed1d9e48e54df2c98b6405e0996a3e97490b2bdVladislav Kaznacheev getString(R.string.popup_menu_edit_tooltip)); 8099046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov 8199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov // Register a listener to be notified when a menu item in our popup menu has 8299046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov // been clicked. 83e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 8499046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov @Override 8599046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov public boolean onMenuItemClick(MenuItem item) { 8699046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov addToLog("Item '"+ item.getTitle() + "' clicked"); 8799046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov return true; 8899046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov } 8999046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov }); 9099046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov 9199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov // Register a listener to be notified when our popup menu is dismissed. 92e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov popupMenu.setOnDismissListener(new PopupMenu.OnDismissListener() { 9399046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov @Override 9499046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov public void onDismiss(PopupMenu menu) { 9599046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov addToLog("Popup menu dismissed"); 9699046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov } 9799046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov }); 9899046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov 9999046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov // Show the popup menu 100e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov popupMenu.show(); 10199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov } 10299046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov }); 1031c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev // Long tap will show a context menu which is always a platform (not support) menu. 1041c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev registerForContextMenu(button); 1051c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev } 1061c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev 1071c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev @Override 1081c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev public void onCreateContextMenu(ContextMenu menu, View v, 1091c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev ContextMenu.ContextMenuInfo menuInfo) { 1101c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev populateMenu(getMenuInflater(), menu); 1111c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev } 1121c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev 1131c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev private void populateMenu(MenuInflater menuInflater, Menu menu) { 1141c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev SwitchCompat dividersToggle = findViewById(R.id.dividers_toggle); 1151c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev menuInflater.inflate(R.menu.popup_menu, menu); 1161c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev MenuCompat.setGroupDividerEnabled(menu, dividersToggle.isChecked()); 11799046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov } 11899046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov 11999046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov private void addToLog(String toLog) { 12099046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov String toPrepend = mDateFormat.format(new Date()) + " " + toLog + "\n"; 12199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov mLog.setText(toPrepend + mLog.getText()); 12299046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov } 12399046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov} 124