5

Also meine ExpandableListView hat Gruppenzeilen, die wie definiert sind:Erhalten Zusammenhang mit PopupMenu wie 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> 

Wenn Sie auf den TextView klicken, wird es erweitern oder verkleinern, je nachdem, ob oder nicht die untergeordneten Zeilen werden derzeit angezeigt. Ich habe eine OnClickListener an die ImageView in der Gruppe Zeile angehängt. Wenn diese ImageView geklickt wird ich eine PopupMenu wie die Bilder starten unter:

enter image description here

enter image description here

Sobald die PopupMenu angezeigt wird und eine der Aktionen angeklickt wird, würde Ich mag eine Aktion für alle ausführen Kinder der Gruppe. Das Problem ist, dass ich die Zeile nicht bestimmen kann, in der der ImageView geklickt wurde.

Die einzige Art, wie ich herausgefunden haben, wie man eine Aktion für alle Kinder gelten soll mit einem ContextMenu wie das Bild unten:

enter image description here

Ich möchte auf eine Gruppe ein ContextMenu weil ein LongClick zu vermeiden, mit Die Zeile ist möglicherweise für einen Benutzer nicht offensichtlich, um herauszufinden, dass einige Aktionen für die untergeordneten Zeilen ausgeführt werden. Ich denke, das offensichtliche Design besteht darin, eine PopupMenu an eine ImageView (in meinem Fall ein Menüsymbol) zu verankern und die Aktion auf die untergeordneten Zeilen dieser Gruppe anzuwenden. Wie kann ich diese Funktionalität mit einer PopupMenu bekommen?

Antwort

4

So habe ich herausgefunden, dass, um einigen Zusammenhang mit der Menü-Symbol geklickt wurde zu haben, ich verwenden, um die setTag() und getTag() Methoden der View Klasse und angewandter nur diese Methoden zum ImageView (Menüsymbol).

+0

Auch wenn es mehr als ein Jahr her, seit du das geschrieben, löste ich das anders und hielt die contextView verwenden, aber wenn die angeschlossene Ansicht, die eine bestimmte ID abgestimmt ich es umwandeln würde zu einem Popup. http://stackoverflow.com/questions/12407722/how-to-cancel-the-creation-of-a-context-menu-after-oncreatecontextmenu-has-bee/24014727#24014727 Überprüfen Sie meine Antwort hier, wenn Sie bin interessiert. (Und lassen Sie mich wissen, wenn ich ein Idiot bin) –

3

Sie benötigen:

  • A View wo die PopUpMenu (Ihr ImageView)
  • A PopUpMenu gespeichert in res/Menü aufzublasen, in diesem Fall popup_select_deselect.xml
  • Ihre eigene onMenuItemClickListener als interne Klasse deklariert, in diesem Fall onMenuItemClickListener_View

Code:

Der obige Code ist nur eine statische Erklärung, was Ihre eigenen OnMenuItemClickListener tun werden.

Beachten Sie die View im Konstruktor des folgenden Listeners. Wenn Sie eine Instanz dieses Listeners erstellen, ist die View-ID dieselbe, die im XML-Layout deklariert wurde. Zur Laufzeit wird es aktualisiert. Wenn die Methode onMenuItemClick aufgerufen wird, ist die ID TextView bereits geändert.

Hier ist der Code:

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

Das, was ich gesucht habe. Vielen Dank! – Sufian