android - permitir - Cómo evitar que se cierre el menú emergente al hacer clic en la casilla de verificación
permitir ventanas emergentes firefox (6)
El truco aquí es mostrar el menú justo después de descartarlo.
Debajo hay un fragmento de código de muestra:
popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
if(item.getItemId()==R.id.search_by_date_checkbox){
item.setChecked(!item.isChecked());
}
//This is the trick here!!!!
popupMenu.show();
return true;
}
});
¡Puedes probar este truco con tu código! Así es como lo hice. :)
Busco mucho en la red, pero no hay nada sobre cómo evitar que se cierre el menú emergente.
Cada vez que hago clic en el elemento de la casilla de verificación o en cualquier otro elemento del menú emergente, el menú emergente se descarta. ¿Cómo puedo evitar que se descarte cuando el usuario marque / desmarque la casilla de verificación en el menú emergente?
Estoy mostrando el menú emergente en el evento de clic del elemento barra de acciones.
//main_menu.xml
<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.worldofjobs.woj.MainActivity" >
<item
android:id="@+id/action_popUpMenu"
android:icon="@drawable/ic_action_overflow"
android:title="@string/main_action_popUpMenu"
app:showAsAction="always"/>
</menu>
//popup_items.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/refresh_item"
android:title="@string/main_refresh"/>
<item
android:id="@+id/checkbox_item"
android:checkable="true"
android:title="Start notification"/>
<item
android:id="@+id/changePasswrod_item"
android:title="@string/main_changePassword"/>
<item
android:id="@+id/deleteAccount_item"
android:title="@string/main_deleteAccount"/>
<item
android:id="@+id/logout_item"
android:title="@string/main_logout"/>
</menu>
/**
* Shows popup menu on click of action bar-menu inflates from
* menu.pop_items-xml
*/
private void showPopup() {
try {
View v = findViewById(R.id.action_popUpMenu);
PopupMenu popup = new PopupMenu(this, v);
popup.setOnMenuItemClickListener(MainActivity.this);
MenuInflater inflater = popup.getMenuInflater();
inflater.inflate(R.menu.pop_items, popup.getMenu());
popup.show();
} catch (Exception e) {
Log.e("MainActivity-showPopup:", e.toString());
}
}
/**
* Handles click events of popup menu items
*/
@Override
public boolean onMenuItemClick(MenuItem item) {
super.onMenuItemSelected(1, item);
switch (item.getItemId()) {
case R.id.refresh_item:
refresh();
return true;
case R.id.checkbox_item:
return true;
case R.id.changePasswrod_item:
changePasswordPopup();
return true;
case R.id.deleteAccount_item:
deleteAccount();
return true;
case R.id.logout_item:
session.logout();
finish();
return true;
}
return true;
}
El uso de popupMenu.show()
para volver a mostrar inmediatamente el menú emergente no funciona correctamente con elementos de menú seleccionables al cambiar sus estados marcados.
Aquí un método que evita el cierre del menú emergente en primer lugar. Asegúrese de que onMenuItemClick
devuelva falso.
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
item.setChecked(!item.isChecked());
// Do other stuff
// Keep the popup menu open
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
item.setActionView(new View(context));
item.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
return false;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
return false;
}
});
return false;
}
});
En tu caso R.id.checkbox_item
return false;
Esto le indicará al sistema que el evento aún no se ha procesado y no atenuará el menú. Vea AQUÍ
Intenta declarar el PopupMenu globalmente y llama a popup.show();
antes de volverse verdadero en la función onMenuItemClick
.
La respuesta de Oliver anterior ( https://.com/a/31727213/2423194 ) me provocó un bloqueo y su mensaje me MenuItemCompat
usara MenuItemCompat
. Después de algunos ajustes a este código, funciona:
// Keep the popup menu open
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
item.setActionView(new View(getContext()));
MenuItemCompat.setOnActionExpandListener(item, new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
return false;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
return false;
}
});
Gracias Oliver!
Lo conseguí trabajando agregando popup.show (); al hacer clic en el botón y al final del clic.
final ImageButton layerButton = (ImageButton) findViewById(R.id.layers);
final PopupMenu popup = new PopupMenu(MapsActivity.this, layerButton);
popup.getMenuInflater().inflate(R.menu.toolbar_menu, popup.getMenu());
layerButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Here
popup.show();
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
handleClicksOnCheckBoxes(item);
return true;
}
});
//And here
popup.show();
}
});
Sin embargo, esta no es una solución óptima porque si la lista tiene tantos elementos que será posible desplazarse por la lista, la lista se desplazará hacia arriba al hacer clic en un elemento.