5

Quindi il mio ExpandableListView ha raggruppare le righe che sono definiti come:Ottenere contesto PopupMenu come ContextMenu

group_row.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <TextView 
     android:id="@+id/GroupName" 
     style="@style/ListViewRowStyle" 
     android:paddingLeft="40dp" 
     android:textSize="18sp" > 
    </TextView> 

    <ImageView 
     android:id="@+id/Menu" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_marginTop="10dp" 
     android:contentDescription="@string/default_content_description_text" 
     android:src="@drawable/ic_menu_moreoverflow_normal_holo_light" > 
    </ImageView> 

</RelativeLayout> 

Quando si fa clic sul TextView si espanderà o comprimere a seconda che o non sono attualmente visualizzate le righe figlio. Ho allegato uno OnClickListener allo ImageView nella riga di gruppo. Quando questo ImageView si fa clic su lancio di un PopupMenu come le immagini qui sotto:

enter image description here

enter image description here

Una volta che il PopupMenu viene visualizzato e una delle azioni viene cliccato, vorrei eseguire un'azione su tutto figli del gruppo. Il problema è che non riesco a determinare la riga in cui è stato fatto clic su ImageView.

L'unico modo che ho capito come applicare un'azione a tutti i bambini è con un ContextMenu come l'immagine qui sotto:

enter image description here

Voglio evitare di utilizzare un ContextMenu perché un LongClick su un gruppo la riga potrebbe non essere ovvia per un utente per capire che potrebbe far comparire alcune azioni da eseguire sulle righe dei bambini. Penso che il design più ovvio sia quello di ancorare un PopupMenu a un ImageView (nel mio caso un'icona di menu) e fare in modo che l'azione venga applicata alle righe secondarie di quel gruppo. Come posso ottenere questa funzionalità con un PopupMenu?

risposta

4

Così ho capito che per avere qualche contesto dei quali è stato cliccato sull'icona del menu, ho usato le setTag() e getTag() metodi della classe View ed appena applicato questi metodi alla (icona del menu) ImageView.

+0

Anche se è passato più di un anno da quando hai postato questo, ho risolto in modo diverso e tenuta mediante l'ContextView, ma se la vista allegato abbinato un determinato ID mi piacerebbe converto a un popup. http://stackoverflow.com/questions/12407722/how-to-cancel-the-creation-of-a-context-menu-after-oncreatecontextmenu-has-bee/24014727#24014727 Controlla la mia risposta qui se sei interessato. (E fammi sapere se sono un idiota) –

3

è necessario scaricare:

  • Un View dove gonfiare il PopUpMenu (il vostro ImageView)
  • Un PopUpMenu salvato in res/menù, in questo caso popup_select_deselect.xml
  • Il proprio onMenuItemClickListener dichiarata come classe interna, in questo caso onMenuItemClickListener_View

Codice:

//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 (i.e. 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 

} 

Il codice sopra riportato è solo una dichiarazione statica di ciò che farà il proprio OnMenuItemClickListener.

Prestare attenzione al dato View nel costruttore del seguente listener. Quando si crea un'istanza di questo listener, l'ID View è lo stesso dichiarato nel layout XML. Al runtime verrà aggiornato, quindi quando verrà chiamato il metodo onMenuItemClick, l'ID TextView è già stato modificato.

Ecco il codice:

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; 
      } 

     } 
    } 
} 
+0

La cosa che stavo cercando. Grazie! – Sufian