traduccion studio boton barra bar agregar acciones android android-actionbar android-contextmenu

android - studio - Ocultar elementos en la barra de acción de contexto(CAB) dinámicamente cuando se seleccionan varios elementos



menu overflow android studio (1)

Tengo un listActivity que muestra CAB en un clic largo. Si se selecciona más de 1 elemento, me gustaría ocultar uno de mis elementos de menú.

onItemCheckedStateChanged() un seguimiento del número de elementos seleccionados en onItemCheckedStateChanged() . Sin embargo, no tengo acceso al menú para eliminar el elemento de esta función. Vea los comentarios en el código a continuación para tener una idea de lo que estaba tratando. Siento que me estoy perdiendo algo de comprensión básica simple ... el código de abajo se llama desde mi función onCreate() .

private void setupActionBarContext() { ListView listView = getListView(); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); listView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() { private int selCount = 0; ArrayList<Long> idList = new ArrayList<Long>(); @Override public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { if (checked) { selCount++; idList.add(id); } else { selCount--; idList.remove(id); } mode.setTitle(selCount + " selected"); // I WOULD LIKE TO HIDE ITEM ON MENU IF ''selCount'' IS > 1 // For example something like this... // if (selCount > 1) { // MenuItem item = menu.findItem(R.id.edit_item); // item.setVisible(false); // } else { // MenuItem item = menu.findItem(R.id.edit_item); // item.setVisible(false); // } } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.delete_item: for(Long i: idList){ mDbHelper.deleteItem(i); } mode.finish(); return true; case R.id.edit_item: Toast.makeText(getBaseContext(), "Edit Item", Toast.LENGTH_SHORT).show(); mode.finish(); // Action picked, so close the CAB return true; default: return false; } } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { // Inflate the menu for the CAB MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.context_menu, menu); return true; } @Override public void onDestroyActionMode(ActionMode mode) { selCount = 0; idList.clear(); } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; } });

Y mi elemento de menú ...

<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/edit_item" android:title="@string/edit_item" android:showAsAction="ifRoom" android:orderInCategory="1"/> <item android:id="@+id/delete_item" android:title="@string/delete_item" android:icon="@drawable/ic_action_delete" android:showAsAction="ifRoom" android:orderInCategory="2"/> </menu>


Como se sugiere en el comentario de adneal.

Añadir invalidate () a onItemCheckedStateChanged()

@Override public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { if (checked) { selCount++; idList.add(id); } else { selCount--; idList.remove(id); } mode.setTitle(selCount + " selected"); mode.invalidate(); // Add this to Invalidate CAB }

Esto invalida el CAB y hace que se onPrepareActionMode() función onPrepareActionMode() .

@Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { if (selCount == 1){ MenuItem item = menu.findItem(R.id.edit_item); item.setVisible(true); return true; } else { MenuItem item = menu.findItem(R.id.edit_item); item.setVisible(false); return true; } }