I want to show the popup menu on longer click of action bar but exactly below where I click.
toolbar.setOnLongClickListener(new View.OnLongClickListener() {
#Override
public boolean onLongClick(View v) {
PopupMenu popupMenu = new PopupMenu(HomeActivity.this,toolbar);
popupMenu.getMenuInflater().inflate(R.menu.popup_menu,popupMenu.getMenu());
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
#Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.device_setting:
Toast.makeText(HomeActivity.this, "dev settings", Toast.LENGTH_SHORT).show();
break;
case R.id.app_update:
break;
case R.id.wireless_setting:
break;
case R.id.hide_footer:
break;
}
return true;
}
});
popupMenu.show();
return true;
}
});
and popup_menu.xml is below
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="#+id/device_setting"
android:title="Device Setting"></item>
<item android:id="#+id/app_update"
android:title="App Update"></item>
<item android:id="#+id/wireless_setting"
android:title="Wireless Setting"></item>
<item android:id="#+id/hide_footer"
android:title="Full Screen"></item>
</menu>
screen shot is given below.
I want to open popup exactly below where I click (longer click)on ActionBar. Please help
Image Screenshot
According to your requirement, you just need to use the popup window because is very flexible, I prefer this GitHub library
https://github.com/kakajika/RelativePopupWindow
Here, just need to change the position of the window for example
popup.showOnAnchor(toolbar, VerticalPosition.BELOW, HorizontalPosition.LEFT);
Related
I would like to be able to keep the check in a menu when selecting an item, but when clicking it and then reopening the menu, the check disappeared.
image of the menu where I select an item
image where I reopen the menu but it is visually as if I had not clicked
here is the menu in java code
public void buttoninit(){
button1 = findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
// Para agregar un Popup Menu a un Button
PopupMenu popupMenu = new PopupMenu(mostrarActivity.this, button1);
popupMenu.getMenuInflater().inflate(R.menu.menu_filter_pa, popupMenu.getMenu());
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
#Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_pa_rut:
if (item.isChecked()) item.setChecked(false);
else item.setChecked(true);
a = 1;
break;
case R.id.menu_pa_nombre:
if (item.isChecked()) item.setChecked(false);
else item.setChecked(true);
a = 2;
break;
case R.id.menu_pa_apellido:
if (item.isChecked()) item.setChecked(false);
else item.setChecked(true);
a = 3;
break;
default:
return false;
}
return true;
}
});
popupMenu.show();
}
});
}
here is the Menu in XML
<group android:checkableBehavior="single">
<item
android:id="#+id/menu_pa_rut"
android:icon="#drawable/ic_filter_list"
android:title="Rut"
app:showAsAction="ifRoom">
</item>
<item
android:id="#+id/menu_pa_nombre"
android:icon="#drawable/ic_filter_list"
android:title="Nombre"
app:showAsAction="ifRoom">
</item>
<item
android:id="#+id/menu_pa_apellido"
android:icon="#drawable/ic_filter_list"
android:title="Apellido"
app:showAsAction="ifRoom">
</item>
</group>
Whenever you will click on button to populate option menu it will reinitialize every time and default value and checks will be applied.
You will have to store click position for the clicked radio button of menu and set checked accordingly.
Or initialize your popup option menu only once by declaring it globally.
you have to move your code out of setOnClickListener just keep popupMenu.show()
and if you want to save your ui state or menu, the better way is to use a live data and viewModel. the live data keeps value even if configuration changes.
I'm working on a gridLayout with recyclerView in android.I've a an option with each grid Item where I want to show my popup activity which is another class. Please see the image -
There is a menu option with each Item. and my popup activity java name is CustomPop.Class. I use a recyclerView for showing gridViews and its holder method is like
public void onBindViewHolder(ViewHolder holder, int position) {
holder.img_chatroom_menu.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), ChatroomPopup.class);
view.getContext().startActivity(intent);
}
});
}
By this I can show the popup activity. But the problem is It's appear in the middle of the activity but I want it to open beside the menu option.
as per my above comment you can use Popup Menu
Android Popup Menu displays the menu below the anchor text if space is available otherwise above the anchor text. It disappears if you click outside the popup menu.
try this create menu file
file: poupup_menu.xml
<menu xmlns:androclass="http://schemas.android.com/apk/res/android" >
<item
android:id="#+id/one"
android:title="One"/>
<item
android:id="#+id/two"
android:title="Two"/>
<item
android:id="#+id/three"
android:title="Three"/>
</menu>
than use create popup menu like this
holder.img_chatroom_menu.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
//Creating the instance of PopupMenu
PopupMenu popup = new PopupMenu(MainActivity.this, button1);
//Inflating the Popup using xml file
popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu());
//registering popup with OnMenuItemClickListener
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(MainActivity.this,"You Clicked : " + item.getTitle(),Toast.LENGTH_SHORT).show();
return true;
}
});
popup.show();//showing popup menu
}
});//closing the setOnClickListener method
here is the sample demo links how to create pop-up menu in android
You should have to use popup menu to achieve what you want just as follow :
Create a menu user res > menu > your_menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="#+id/menu_item_one"
android:title="Item One" />
<item
android:id="#+id/menu_item_two"
android:title="Item Two" />
</menu>
Put above code into your style.xml
<style name="popupMenuStyle" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:textColor">#color/colorBlack</item>
<item name="android:itemBackground">#color/colorWhite</item>
<!--<item name="android:popupBackground">#android:color/white</item>-->
</style>
In your respective RecyclerView Adapter
holder.myAlbumsOptionButton.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
Context wrapper = new ContextThemeWrapper(context, R.style.popupMenuStyle);
final PopupMenu popup = new PopupMenu(wrapper, v, Gravity.END);
popup.inflate(R.menu.your_menu);
popup.show();
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
#Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_item_one:
//Do operation if menu_item_one
break;
case R.id.menu_item_two:
//Do operation if menu_item_two
break;
}
return false;
}
});
}
});
To know more about PopupMenu
I have generated a popUp Menu on button click (as the layout is custom layout so couldn't use onCreateOptionsMenu). Everything is working fine except that the menu looks odd. It has got a shadow behind it which doesn't seem to go well with the app. Is there any way in which I can remove the shadow or make the popup menu look like the menu generated using onCreateOptionsMenu.
Below is the image of my popup Menu
Code: (options_menu.xml)
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="#+id/option1" android:title="#string/option1"
android:orderInCategory="101" android:showAsAction="always|withText" />
<item android:id="#+id/option2" android:title="#string/option2"
android:orderInCategory="102" android:showAsAction="always|withText" />
</menu>
Activity:
popMenuBtn.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
Context wrapper = new ContextThemeWrapper(MenuActivity.this, myPopupMenuTextAppearance);
mPopupMenu = new PopupMenu(wrapper, v);
MenuInflater menuInflater = mPopupMenu.getMenuInflater();
menuInflater.inflate(R.menu.options_menu, mPopupMenu.getMenu());
mPopupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.option1:
startActivity(new Intent(this, XYZ.class));
return true;
case R.id.option2:
someFunction();
return true;
default:
Toast.makeText(this,"You Clicked : " + item.getTitle(),Toast.LENGTH_SHORT).show();
return true;
}
}
});
mPopupMenu.show();
}
});
i am doing a android application for tablet in that
i have a gridView in a view pager
what i want to do is,
i want to add menu to imageview in the gridView like google books
Please see this image for reference
http://i.stack.imgur.com/cf4Or.jpg
i tried placing this in the gridView imageadaptor , no luck
public boolean onOptionsItemSelected(MenuItem item) {
// my code
}
Thanks for your time
You need to use PopupMenu:
http://developer.android.com/reference/android/widget/PopupMenu.html
You need to setup a PopupMenu giving a view as an anchor + specify the menu recourse that will be used here. Of course this should be done inside a OnClickListener for your view.
anchorView.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View view) {
PopupMenu popupMenu = new PopupMenu(context, anchorView);
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.item_one:
// item one clicked
return true;
case R.id.item_two:
// item two clicked
return true;
}
return false;
}
);
popupMenu.inflate(R.menu.popup_menu);
popupMenu.show();
}
});
Define a standard menu resource - here is your popup_menu.xml:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="#+id/item_one"
android:title="Item one"/>
<item
android:id="#+id/item_two"
android:title="Item two"/>
</menu>
Here is a nice tutorial that you can look at:
http://javatechig.com/android/popup-menu-in-android-example
yourImageViewObject.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
PopupMenu popup = new PopupMenu(activity, v);
/** Adding menu items to the popumenu */
popup.getMenuInflater().inflate(R.menu.main, popup.getMenu());
popup.setOnMenuItemClickListener(new OnMenuItemClickListener() {
#Override
public boolean onMenuItemClick(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.spam:
Toast.makeText(activity, "Spam clicked",
Toast.LENGTH_SHORT).show();
break;
case R.id.blockuser:
Toast.makeText(activity, " Block user clicked",
Toast.LENGTH_SHORT).show();
break;
case R.id.remove:
Toast.makeText(activity, "Remove clicked",
Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return false;
}
});
popup.show();
}
});
menu file main.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="#+id/spam"
android:title="Spam"/>
<item
android:id="#+id/blockuser"
android:title="Block User"/>
<item
android:id="#+id/remove"
android:title="Remove"/>
</menu>
put above main.xml in menu folder inside res folder
What you need is a PopupMenu. Create a view that can act as the anchor for the menu and add the PopupMenu as follows:
PopupMenu myPopup = new PopupMenu(context, myAnchor);
myAnchor.setOnTouchListener(myPopup.getDragToOpenListener());
You can follow the below steps... I hope this may help you
Step 1 : Create a menu items in menu resource folder
Somewhat like this :
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="#+id/menuitemone"
android:title="Cut"/>
<item android:id="#+id/menuitemtwo"
android:title="Copy" />
<item android:id="#+id/menuitemthree"
android:title="Paste"/>
</menu>
Step 2: Define an Image view for your individual griditem layout(according to your choice of placement)
Step 3: Define ImageView click listner in your BaseAdaptor class
Step 4: In onclick listner paste this code to show drop down menu
PopupMenu popup = new PopupMenu(MainActivity.this, arg1);
popup.getMenuInflater().inflate(R.menu.menuname, popup.getMenu());
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
Log.i("TEST",item.getTitle());
return true;
}
});
popup.show();
You may need to see if you want a custom design for the same.
Google is your friend.
I want to use popup menu for two(2) buttons. The way I am achieving it right now is by making two separate xml files popup_menu1.xml and popup_menu2.xml which are inflated for each button, button1 and button2 respectively.
Popup-menu-1 has two(2) menu items and popup-menu-2 has four(4) menu items.
The pics are added for more clarification.
popup_menu1.xml has two menu-items, a seperate xml-file
popup_menu2.xml has four menu-items, a separate xml-file
each file is inflated for individual buttons.
My Question is: Can I use(inflate) only one(1) xml-file, instead of two separate xml-files, for two(2) buttons and showing two(2) different popup_menus?
Any help is appreciated.
Thank you,
P.S: I wanted to add pictures for more clarity, but as a new member they are not allowing me to do it.
Code Added:
popup_menu1: File1
<menu xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#+id/menu001">
<group android:id="#+id/group_popupmenu">
<item android:id="#+id/menu1"
android:title="Today's Date"/>
<item android:id="#+id/menu2"
android:title="Custom Date"/>
</group>
</menu>
popup_menu2: File2
<menu xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#+id/menu002">
<group android:id="#+id/group_popupmenu">
<item android:id="#+id/menu1"
android:title="Last Seven (07) Days"/>
<item android:id="#+id/menu2"
android:title="Today"/>
<item android:id="#+id/menu003"
android:title="Yesterday"/>
<item android:id="#+id/menu4"
android:title="Last Twenty Eight (28) Days"/>
</group>
</menu>
Edit version 1:
Code In Activity Class:
// add a click listener to the first button
startDateButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
PopupMenu popup = new PopupMenu (CampaignDetailsActivity.this, view);
popup.getMenuInflater().inflate(R.layout.popup_menu_01, popup.getMenu());
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
switch(item.getItemId()){
case R.id.menu1:
// some code here
case R.id.menu2:
// some code here
}
return true;
});
popup.show();
}
});
// add a click listener to the end date button
endDateButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View button) {
PopupMenu popup = new PopupMenu (TestAdlikelyButtonsAndMenuActivity.this, button);
popup.getMenuInflater().inflate(R.layout.popup_menu2, popup.getMenu());
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
switch(item.getItemId()){
case R.id.menu1:
// some code here
case R.id.menu2:
// some code here
case R.id.menu003:
// some code here
case R.id.menu4:
// some code here
}
return true;
}
});
popup.show();
}
});
Images:
Yes, you can inflate a single XML file multiple times, but in the example you gave, you're doing it right by having two XML files. After inflating, but before calling PopupMenu.show(), you can use one of the variants of Menu.add() to add items to the Menu (the one returned by PopupMenu.getMenu()).