I've implemented a popup menu to my android application. I've created a xml for popup menu and code also works fine. Now what i cant figure out is how to handle popup menu items click. I've tried using PopupMenu.OnMenuItemClickListener but was not successful. How can i do this?
My code for popup menu
ImageButton button = (ImageButton) view.findViewById(R.id.popUp_song);
button.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
PopupMenu popup = new PopupMenu(activity, v);
Menu m = popup.getMenu();
MenuInflater inflater = popup.getMenuInflater();
inflater.inflate(R.menu.song_popup, popup.getMenu());
if (audio.getDownload().equals("0")) {
m.removeItem(R.id.add_download);
}
popup.show();
}
});
xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
style="#style/ToolBarStyle">
<item
android:id="#+id/add_queue"
android:title="Add to queue" />
<item
android:id="#+id/play_next"
android:title="Add to favourite" />
<item
android:id="#+id/add_download"
android:title="Download" />
</menu>
Before showing the PopupMenu add a listener for PopupMenu for handling the click events.
popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
#Override
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(getApplicationContext(),
item.getTitle(), Toast.LENGTH_SHORT).show();
return true;
}
});
If you need to take a click of the popup menu on the basis of id, below is the right way to do this:
popup.setOnMenuItemClickListener(item -> {
if (item.getItemId() == R.id.miEmail) {
Toast.makeText(getApplicationContext(), "Email clicked", Toast.LENGTH_SHORT).show();
} else if (item.getItemId() == R.id.miCall) {
Toast.makeText(getApplicationContext(), "Call clicked", Toast.LENGTH_SHORT).show();
}
return true;
});
Related
I am using an image button for a popup menu to popup everything is working fine but when I select an item in the menu the item is selected and it doesn't show the selection so that I could identify the selected item.The checkbox remains unchecked even after the selection
menu_icon_img=myView.findViewById(R.id.Id_customer_over_flow);
menu_icon_img.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
if (getActivity() != null) {
PopupMenu popup = new PopupMenu(getActivity(), v);
MenuInflater inflater = popup.getMenuInflater();
inflater.inflate(R.menu.sort_menu_items, popup.getMenu());
popup.show();
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
#Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.select_name_a_z:
if (item.isChecked()) item.setChecked(false);
else item.setChecked(true);
return true;
case R.id.select_name_z_a:
if (item.isChecked()) item.setChecked(false);
else item.setChecked(true);
return true;
default:
return false;
}
}
});
}
}
XML
<menu xmlns:android="http://schemas.android.com/apk/res/android"
>
<group
android:checkableBehavior="single"
>
<item
android:id="#+id/select_name_a_z"
android:title="#string/name_a_z"
android:checkable="true"
/>
<item
android:id="#+id/select_name_z_a"
android:title="#string/name_z_a"
android:checkable="true"
/>
</group>
</menu>
The problem is you are creating the popup menu from onClick of an imageview. whenever a click event occures a new instance of popup menu is being created.
to avoid this initiate the popup menu in onCreate method. And call popup.show() from onClick() method.
Toolbar menus are supposed to navigate you the specified activities or fragments on click of the pop up.I am not sure what is the problem , but once you click on any MenuItem it will navigate you to given Intent associated with the the id for example,
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.select_name_a_z:
Intent intent=new Intent(MainActivity.this,SecondActivity.this);
startActivity(intent);
return true;
If you are using a checkable menu item then change the below code from
case R.id.select_name_z_a:
if (item.isChecked())
item.setChecked(false);
else item.setChecked(true);
return true;
Do like
if (!item.isChecked()) item.setChecked(true);
Because item.ischecked() is false in the beginning state.
Made some changes to your above code, Try this
menu_icon_img=findViewById(R.id.Id_customer_over_flow);
popup = new PopupMenu(getApplicationContext(), menu_icon_img);
MenuInflater inflater = popup.getMenuInflater();
inflater.inflate(R.menu.sort_menu_items, popup.getMenu());
menu_icon_img.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
if (this != null) {
popup.show();
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
#Override
public boolean onMenuItemClick(MenuItem item) {
Menu menu = popup.getMenu();
for(int i = 0;i<menu.size();i++){
menu.getItem(i).setChecked(false);
}
item.setChecked(true);
return true;
}
});
}
}
});
Also for all items in menu set:
android:checkable="true"
In my android app I have a menu option which works when the device has dedicated hardware menu option. for another device I don't have dedicated Menu button so I tried to add a button and on click of that a popup will display the menu, The popup is working but not displaying the options, and further to that how to work on the selected popup option.
My button layout is as follows:
<ImageButton
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="#drawable/ic_overflow_holo_dark"
android:contentDescription="#string/descr_overflow_button"
android:onClick="showPopup" />
This is my code to show the popup:
public boolean showPopup(View v) {
PopupMenu popup = new PopupMenu(this, v);
MenuInflater inflater = popup.getMenuInflater();
inflater.inflate(R.menu.emailmenu, popup.getMenu());
popup.show();
return true;
}
And this my option code:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="#+id/bluebutton" android:icon="#drawable/icon_blue_btn"
android:title="" />
<item android:id="#+id/zephyr" android:icon="#drawable/icon_zephyrme"
android:title="" />
<item android:id="#+id/skype" android:icon="#drawable/icon_skype"
android:title="" />
</menu>
I all ready have this onCreateOptionsMenu() for triggering the option from dedicated menu key. How to get it to work from popup.
If you want to show Icons instead of Title, then create your PopupMenu like below
The method setForceShowIcon(menu); will force the PopMenu to show icons.
you can have text with icons too.
private void showPopupMenu(){
PopupMenu menu=new PopupMenu(this,anchorView);
menu.getMenuInflater().inflate(R.menu.popup_menu,menu.getMenu());
setForceShowIcon(menu);
menu.setOnMenuItemClickListener(menuClickListner);
menu.show();
}
public static void setForceShowIcon(PopupMenu popupMenu) {
try {
Field[] fields = popupMenu.getClass().getDeclaredFields();
for (Field field : fields) {
if ("mPopup".equals(field.getName())) {
field.setAccessible(true);
Object menuPopupHelper = field.get(popupMenu);
Class<?> classPopupHelper = Class.forName(menuPopupHelper
.getClass().getName());
Method setForceIcons = classPopupHelper.getMethod(
"setForceShowIcon", boolean.class);
setForceIcons.invoke(menuPopupHelper, true);
break;
}
}
} catch (Throwable e) {
e.printStackTrace();
}
}
//This is Menu click listner
PopupMenu.OnMenuItemClickListener menuClickListner = new PopupMenu.OnMenuItemClickListener() {
#Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()){
case R.id.some_id1:
//actions here
break;
case R.id.some_id2:
//actions here..
break;
case R.id.some_id3:
break;
}
return false;
}
};
Hope this helps!
try like this
PopupMenu popup = new PopupMenu(MainActivity.this, button1);
popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu());
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
#Override
public boolean onMenuItemClick(MenuItem item) {
startActivity(new Intent(MainActivity.this, SecounActivity.class));
return true;
}
});
popup.show();
I have implemented popup menu in button onClick, with AppCompact theme I can get the menu overflow with empty items in menu. please help me on this
OptionMenuBtn = (ImageButton) v.findViewById(R.id.three_dot);
OptionMenuBtn.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
// TODO Auto-generated m// openOptionsMenu();
showPopup(v);
}
});
public void showPopup(View v) {
PopupMenu popup = new PopupMenu(MainActivity.this, v);
MenuInflater inflater = popup.getMenuInflater();
inflater.inflate(R.menu.action_menu, popup.getMenu());
popup.show();
}
this should be the Xml file :
<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="#+id/menu_edit"
android:title="#string/menu_edit" />
<item
android:id="#+id/menu_block"
android:title="#string/menu_deactivate" /></menu>
and the code in activity on your onclick
PopupMenu popupMenu = new PopupMenu(YourActivity.this, view);
popupMenu.setOnMenuItemClickListener(YourActivity.this);
popupMenu.inflate(R.menu.menu_import_export);
popupMenu.show();
and implements :
#Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_edit:
//TODO
return true;
case R.id.menu_block:
//TODO
return true;
}
return false;
}
listview item
Popup-menu :
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.edusols.HomeActivity" >
<item
app:showAsAction="never"
android:id="#+id/one"
android:title="abcd" />
<item
android:id="#+id/two"
android:title="Two"/>
<item
android:id="#+id/three"
android:title="Three"/>
</menu>
I have a listview, i have option like edit post and all that
I want popup-menu on particular position, i am getting pop-up menu but not at correct position
I have set pop-up menu in listview adapter
code:
ivOptionMenu.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
if (post_user_id.equals(preferenceHelper.getID()))
{
PopupMenu popup = new PopupMenu(ctx, ivOptionMenu);
popup.getMenuInflater().inflate(R.menu.poupup_menu, popup.getMenu());
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(ctx,"You Clicked : " + item.getTitle(),Toast.LENGTH_SHORT).show();
return true;
}
});
popup.show();//showing popup menu
}
else {
PopupMenu popup = new PopupMenu(ctx, ivOptionMenu);
popup.getMenuInflater().inflate(R.menu.poupup_menu, popup.getMenu());
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(ctx,"You Clicked : " + item.getTitle(),Toast.LENGTH_SHORT).show();
return true;
}
});
popup.show();//showing popup menu
}
How menu appears on click
Create xml file in /res/menu/popup_menu.xml and add these code
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="#+id/action1"
android:title="delete" />
<item
android:id="#+id/action2"
android:title="properties" />
<item
android:id="#+id/action3"
android:title="add to queue" />
<item
android:id="#+id/action4"
android:title="play next" />
<item
android:id="#+id/action5"
android:title="add to favorite" />
</menu>
Use this code in java file:
mViewHolder.imagemore.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
final PopupMenu menu = new PopupMenu(context, v);
menu.getMenuInflater().inflate(R.menu.popup_menu, menu.getMenu());
menu.show();
menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
#Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.action1:
deleteSong(position);
break;
case R.id.action2:
Toast.makeText(context, "your desire action is " + item.toString(), Toast.LENGTH_SHORT).show();
break;
case R.id.action3:
Toast.makeText(context, "your desire action is " + item.toString(), Toast.LENGTH_SHORT).show();
break;
case R.id.action4:
Toast.makeText(context, "your desire action is " + item.toString(), Toast.LENGTH_SHORT).show();
break;
case R.id.action5:
Toast.makeText(context, "your desire action is " + item.toString(), Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}
});
}
});
PopMenuConstructor(ctx,view)
view by which PopMenu will connected.
#Override
public void onClick(View v) {
if (post_user_id.equals(preferenceHelper.getID())) {
//PopupMenu popup = new PopupMenu(ctx, ivOptionMenu);
//change to this
PopupMenu popup = new PopupMenu(ctx, v);
.
.
}
}
I am working on an timetable app, but I have a strange problem, I created a popupmenu that opens upon clicking an action-bar item.
The popup works, but it opens inside the action bar, I want that it opens in the view below.
My code..
#Override
public void onCreateOptionsMenu(
Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.lists_choice_mode_mulitplue, menu);
}
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.inverse:
showPopupMenu(this.getView());
return true;
}
return false;
}
private void showPopupMenu(View v){
final Activity activity = getSupportActivity();
PopupMenu popupMenu = new PopupMenu(activity, v);
popupMenu.getMenuInflater().inflate(R.menu.popup, popupMenu.getMenu());
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
#Override
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(activity,
item.toString(),
Toast.LENGTH_LONG).show();
return true;
}
});
popupMenu.show();
}
My .xml layout files
popup.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:id="#+id/group_popupmenu">
<item android:id="#+id/menu1"
android:title="Popup menu item 1"/>
<item android:id="#+id/menu2"
android:title="Popup menu item 2"/>
<item android:id="#+id/menu3"
android:title="Popup menu item 3"/>
</group>
</menu>
My action bar button .xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="#+id/inverse"
android:showAsAction="always|withText"
android:title="Week"
android:titleCondensed="Week" />
</menu>
Yeah it's fixed now!
Its wrong to to showPopupMenu(this.getView());
It should be the id of icon in action bar.. as following..
#Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.inverse:
showPopupMenu(R.id.inverse);
return true;
}
return false;
}
change showpopupmenu(view v) in
private void showPopupMenu(int id){
final Activity activity = getSupportActivity();
View v = activity.findViewById(id);
PopupMenu popupMenu = new PopupMenu(activity, v);
popupMenu.getMenuInflater().inflate(R.menu.popup, popupMenu.getMenu());
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
#Override
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(activity,
item.toString(),
Toast.LENGTH_LONG).show();
return true;
}
});
popupMenu.show();
}
It works now! Thanks for the answers it didn't help me but it is appreciated!
You are inflating your menu layout, and I think that you want to inflate your activity layout.
check this previous question that shows how to inflate a layout:
How to inflate one view with a layout