Obtenga contexto de PopupMenu como ContextMenu

Entonces mi ExpandableListView tiene filas de grupo que se definen como:

group_row.xml

        

Cuando hace clic en TextView se expandirá o colapsará dependiendo de si las filas secundarias se muestran actualmente o no. He adjuntado un OnClickListener a ImageView en la fila del grupo. Cuando se hace clic en este ImageView PopupMenu un PopupMenu como las imágenes a continuación:

enter image description here

enter image description here

Una vez que se muestra PopupMenu y se hace clic en una de las acciones, me gustaría realizar una acción en todos los niños del grupo. El problema es que no puedo determinar la fila en la que se hizo clic en ImageView .

La única forma en que he descubierto cómo aplicar una acción a todos los niños es con un ContextMenu como la imagen siguiente:

enter image description here

Quiero evitar usar un ContextMenu porque un LongClick en una fila de grupo puede no ser obvio para que un usuario descubra que mostraría algunas acciones para realizar en las filas de los niños. Creo que el diseño más obvio es anclar un PopupMenu a un ImageView (en mi caso un ícono de menú) y hacer que la acción se aplique a las filas secundarias de ese grupo. ¿Cómo puedo obtener esta funcionalidad con un PopupMenu ?

Así que me di cuenta de que para tener un contexto en el que se hiciera clic en el ícono de menú, utilicé los métodos setTag () y getTag () de la clase View y simplemente apliqué estos métodos a ImageView (ícono de menú).

Necesitas:

  • Una View donde inflar PopUpMenu (su ImageView )
  • Un PopUpMenu guardado en res / menu, en este caso popup_select_deselect.xml
  • Su propio onMenuItemClickListener declarado como clase interna, en este caso onMenuItemClickListener_View

Código:

 //TODO initialize rows[] for (int i = 0; i < rows.lenght; i++){ //inflate you group_row getLayoutInflater().inflate(R.layout.group_row, (ViewGroup)findViewById(R.id.rows_container)); ImageView v_Overflow = (ImageView)findViewById(R.id.Menu); //Set onClickListener v_Overflow.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { View v_Button = v; PopupMenu pum= new PopupMenu(YourActivity.this, v); //set my own listener giving the View that activates the event onClick (ie YOUR ImageView) pum.setOnMenuItemClickListener(new onMenuItemClickListener_View(v) ); //inflate your PopUpMenu getMenuInflater().inflate(R.menu.popup_select_deselect, pum.getMenu()); pum.show(); } }); //Update the id of your TextView .setId(i); //the i value will be your UNIQUE id for the ImageView } 

El código anterior es solo una statement estática de lo que hará su propio OnMenuItemClickListener .

Preste atención a la View dada en el constructor del siguiente oyente. Cuando crea una instancia de este oyente, View Id es el mismo declarado en el diseño XML. En tiempo de ejecución, se actualizará, por lo que cuando se onMenuItemClick el método onMenuItemClick , la ID de TextView ya se modificó.

Aquí está el código:

 private class onMenuItemClickListener_View implements OnMenuItemClickListener{ View v_View; public onMenuItemClickListener_View(View v){ v_View=v; } @Override public boolean onMenuItemClick(MenuItem item) { int i = v_View.getId(); switch (item.getItemId()) { case R.id.popupItemSelectAll: Toast.makeText(YourActivity.this, "Popup Select All for View #: " + rows[i], Toast.LENGTH_SHORT).show(); //TODO your code to select all return true; case R.id.popupItemDeselectAll: Toast.makeText(YourActivity.this, "Popup Deselect All for View #: " + rows[i], Toast.LENGTH_SHORT).show(); //TODO your code to deselect all return true; default: return false; } } } }