1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Context-Menü on TableRow

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von witschi87, 05.10.2011.

  1. witschi87, 05.10.2011 #1
    witschi87

    witschi87 Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    05.10.2011
    Hey Leute,

    ich versuche gerade verzweifelt ein Context-Menü in meinem TableLayout zu implementieren. Ich füge dynamisch in mein TableLayout einige TableRows hinzu und "registiere" diese für Context-Menüs.
    Code:
    final TableRow listRow = (TableRow) inflater.inflate(R.layout.suggestion_list_item, null);
    ....
    registerForContextMenu(listRow);
    Anschließend überschreibe ich die Methoden onCreateContextMenu und onContextItemSelected.

    Code:
    @Override
        public void onCreateContextMenu(ContextMenu menu, View v,
                ContextMenuInfo menuInfo) {
            super.onCreateContextMenu(menu, v, menuInfo);
            MenuInflater inflater_menu = getMenuInflater();
            inflater_menu.inflate(R.menu.context_suggestion, menu);
            menu.setHeaderTitle(R.string.options);
        }
    
    Dies funktioniert bis dahin auch alles sehr gut, und wenn ich eine TableRow länger gedrückt halte, bekomme ich mein gewünschtes Context-Menü. Hier die xml dazu:
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <menu
      xmlns:android="http://schemas.android.com/apk/res/android">
          <item android:id="@+id/edit"
              android:title="@string/edit" />
        <item android:id="@+id/delete"
              android:title="@string/delete" />
    </menu>
    
    Aber bereits in der onCreateContextMenu-Methode ist der Parameter menuInfo null. In der onContextItemSelected-Methode entsprechend auch. Nun die Frage: wie kriege ich beim Klick auf einen Context-Menüpunkt heraus, von welcher TableRow das Context-Menü geöffnet wurde?

    Ich hoffe mir kann jemand helfen und ich hoffe ich habe alle nötigen und relevanten Code-Ausschnitte eingefügt.

    Schönen Abend
    Christoph
     
  2. Tom299, 06.10.2011 #2
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Hängen deine TableRows in einer ListView? Wenn ja, registrier mal die ListView für Context-Menüs, so hab ich es jedenfalls bei mir realisiert und das funktioniert.
     
  3. witschi87, 06.10.2011 #3
    witschi87

    witschi87 Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    05.10.2011
    Nein, die TableRows hängen in einem TableLayout. Wenn ich zusätzlich das TableLayout für das ContextMenü registriere, habe ich ein doppeltes Menü. Also Header, Bearbeiten, Löschen, Bearbeiten, Löschen. Aber auch da ist auf Druck aller Menüpunkt menuInfo NULL.
    Hier mal meine Layouts:

    meeting_view.xml:
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <ScrollView android:id="@+id/scrollView1" android:layout_height="wrap_content" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent">
    <LinearLayout
      android:layout_width="match_parent"
      android:orientation="vertical" android:layout_height="wrap_content">
        <LinearLayout
          android:layout_width="match_parent"
          android:orientation="vertical" android:layout_height="wrap_content">
            <TextView android:id="@+id/meetingTitle" android:layout_height="wrap_content" android:text="TextView" android:layout_width="match_parent" android:gravity="center_horizontal" android:shadowColor="#f00" android:shadowRadius="3"></TextView>
            <TableLayout android:id="@+id/list_suggestions" android:layout_height="wrap_content" android:layout_width="match_parent" android:stretchColumns="*"></TableLayout>
        </LinearLayout>
        <LinearLayout
          android:layout_width="match_parent"
          android:orientation="vertical" android:layout_height="wrap_content">
            <TextView android:id="@+id/commentsTitle" android:layout_height="wrap_content" android:text="@string/comments" android:layout_width="match_parent" android:gravity="center_horizontal" android:shadowColor="#f00" android:shadowRadius="3"></TextView>
            <TableLayout android:id="@+id/list_comments" android:layout_height="wrap_content" android:layout_width="match_parent"></TableLayout>
        </LinearLayout>
    </LinearLayout>
    </ScrollView>
    suggestion_list_item.xml:
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <TableRow xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/suggestionRow" android:layout_height="wrap_content" android:layout_width="match_parent" android:longClickable="true">
        <LinearLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:orientation="vertical" android:layout_height="wrap_content">
            <LinearLayout android:id="@+id/linearLayout2" android:layout_width="match_parent" android:orientation="horizontal" android:layout_height="wrap_content">
                <ToggleButton android:background="@drawable/picked_button" android:id="@+id/pickedButton" android:layout_height="35dip" android:layout_width="35dip" android:textOn="" android:textOff="" android:layout_marginLeft="15dip" android:layout_marginRight="15dip" android:layout_marginTop="5dip" android:layout_marginBottom="5dip"></ToggleButton>
                   <TextView android:text="TextView" android:id="@+id/suggestion_list_item_date" android:layout_height="wrap_content" android:layout_width="wrap_content" android:maxWidth="100dip" android:layout_gravity="center_vertical"></TextView>
                <RadioGroup android:layout_height="wrap_content" android:id="@+id/voteButtons" android:orientation="horizontal" android:gravity="right" android:layout_width="match_parent" android:layout_gravity="right|center_vertical">
                    <RadioButton android:background="@drawable/vote_no_button" android:id="@+id/voteNoButton" android:layout_width="35dip" android:layout_height="35dip"></RadioButton>
                    <RadioButton android:background="@drawable/vote_maybe_button" android:id="@+id/voteMaybeButton" android:layout_width="35dip" android:layout_height="35dip" android:layout_marginLeft="15dip"></RadioButton>
                    <RadioButton android:background="@drawable/vote_yes_button" android:id="@+id/voteYesButton" android:layout_width="35dip" android:layout_height="35dip" android:layout_marginLeft="15dip" android:layout_marginRight="15dip"></RadioButton>
                </RadioGroup>
            </LinearLayout>
            
            <LinearLayout android:id="@+id/voteBar" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_gravity="center_horizontal" android:background="@drawable/shape">
                <TextView android:id="@+id/voteBarRed" android:layout_height="10dip" android:background="#f00" android:layout_width="wrap_content"></TextView>
                <TextView android:id="@+id/voteBarYellow" android:layout_height="10dip" android:background="#ff0" android:layout_width="wrap_content"></TextView>
                <TextView android:id="@+id/voteBarGreen" android:layout_height="10dip" android:background="#0f0" android:layout_width="wrap_content"></TextView>
                <TextView android:id="@+id/voteBarGrey" android:layout_height="10dip" android:background="#ccc" android:layout_width="wrap_content"></TextView>
            </LinearLayout>
            <TextView android:id="@+id/seperator" android:layout_height="1dip" android:background="#333" android:layout_width="match_parent" android:layout_marginTop="5dip"></TextView>
        </LinearLayout>
    </TableRow>
    Ich möchte damit halt bewirken, dass ich quasi zwei Listen untereinander habe. In diesem speziellen Fall zuerst die "Suggestions", gefolgt von den Kommentaren - jeweils mit Titelzeile (TextView). Damit das ganze dann Scrollbar wird ist alles in einer ScrollView. Mit einer ListView kriege ich dieses Vorhaben leider nicht realisiert, weil ListViews in ScrollViews nicht funktionieren und auch wenig Sinn machen.
    Aber laut Doku ist es möglich für jede View ein ContextMenü zu erstellen. Und eine TableRow ist ja auch nur eine View. Deswegen verstehe ich einfach nicht wo der Fehler ist...
    Sonst Ideen? :/
     
  4. witschi87, 07.10.2011 #4
    witschi87

    witschi87 Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    05.10.2011
    Keine eine Idee? Vielleicht ist ein TableLayout nicht die richtige Lösung? Ich habe mal mein Mockup hochgeladen, um anzudeuten, was ich realisieren möchte. Dabei soll es sowohl auf den Terminvorschlägen im oberen Teil, als auch auf den Kommentaren im unteren Teil ein Context-Menü geben...
     

    Anhänge:

  5. nijoX, 07.10.2011 #5
    nijoX

    nijoX Junior Mitglied

    Beiträge:
    38
    Erhaltene Danke:
    5
    Registriert seit:
    06.09.2011
  6. witschi87, 07.10.2011 #6
    witschi87

    witschi87 Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    05.10.2011
    Dort ist es beschrieben, wie in jedem Tutorial und der Android Doku. Leider klappt es für mich einfach nicht.

    Ich werde nun mal ein bisschen detaillierter:
    Ich habe die Klasse Meeting_View extends Activity mit folgender onCreateMethode:
    Code:
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.meeting_view);
            
            ... [Daten vom http-Server holen]
            
            TableLayout listSuggestions = (TableLayout) findViewById(R.id.list_suggestions);
            addSuggestions(listSuggestions, (List<Object>) meetingInfos.get("Suggestion_Area"), meeting_value);
        }
    
    Die addSuggestions-Methode befüllt nun das TableLayout mit TableRows wie folgt:
    Code:
    private void addSuggestions(TableLayout listSuggestions, List<Object> suggestions, final long meeting_value) {
            LayoutInflater inflater = LayoutInflater.from(this);
            for (Object sugg_object: suggestions) {
                final TableRow listRow = (TableRow) inflater.inflate(R.layout.suggestion_list_item, null);
                
                ... [Anpassung des Inhalts der listRow]
    
                registerForContextMenu(listRow);
                listSuggestions.addView(listRow);            
            }
    }
    
    Und eben die in Post 1 geschriebene onCreateContextMenu-Methode.
    Ich weiß einfach nicht mehr weiter. Mir würde nicht mal ein Workaround einfallen, um dieses Problem zu lösen...
     
  7. witschi87, 14.10.2011 #7
    witschi87

    witschi87 Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    05.10.2011
    Meine Bachelorarbeit stagniert an dieser Stelle... niemand eine Idee? :/
     
  8. MichaelS, 14.10.2011 #8
    MichaelS

    MichaelS Fortgeschrittenes Mitglied

    Beiträge:
    370
    Erhaltene Danke:
    51
    Registriert seit:
    14.08.2009
    Du solltest an der stelle kein TableLayout verwenden, sondern eine ListView List View | Android Developers

    Sonst bekommst du schnell Probleme mit der Performance / Ressourcen Verbrauch.
     
  9. witschi87, 14.10.2011 #9
    witschi87

    witschi87 Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    05.10.2011
    aber damit bekomme ich ja nicht 2 Listen untereinander realisiert. Ich möchte ja nicht innerhalb einer Liste scrollen, sondern hätte gerne "außenrum" ein scrollable. Sodass zuerst alle Terminvorschläge und anschließend erst alle Kommentare aufgelistet werden. Die Kommentare sind dann ggf. gar nicht ohne scrollen zu sehen. Dafür müsste ich dann aber alles in eine ListView tun, und das klingt nicht nach so einer tollen Lösung.
     
  10. MichaelS, 14.10.2011 #10
    MichaelS

    MichaelS Fortgeschrittenes Mitglied

    Beiträge:
    370
    Erhaltene Danke:
    51
    Registriert seit:
    14.08.2009
    Klar ist ohne Probleme machbar. Du kannst 2 Listen untereinander machen. Sowohl kannst du auch ein extra Control oder ListView in eine Listview packen. Sprich oben lässt du deine Einträge und wenn man nach unten scrollt findet man die Kommentare. das is überhaupt kein Problem und ohne großen Aufwand zu machen.

    Aber ist deine Sache. Meine Lösung wäre aufjedenfall besser von der Performance und Ressourcen Verbrauch. :)
     
  11. nijoX, 14.10.2011 #11
    nijoX

    nijoX Junior Mitglied

    Beiträge:
    38
    Erhaltene Danke:
    5
    Registriert seit:
    06.09.2011
  12. witschi87, 17.10.2011 #12
    witschi87

    witschi87 Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    05.10.2011
    ListView in ListView? also so:

    Code:
    <ListView android:layout_height="wrap_content" android:id="@+id/listView1" android:layout_width="fill_parent">
            <ListView android:id="@+id/listViewMeetings" android:layout_height="wrap_content" android:layout_width="fill_parent"></ListView>
        </ListView>
    
    ? Das funktioniert nicht... Ich habe momentan eine ListView in einem LinearLayout und darunter ein TextView zum Test. Das TextView sieht man aber nie, wenn das erste ListView bereits die gesamte Bildschirmhöhe einnimmt...

    Also nochmal zu meinem Vorhaben:

    Ich hätte gerne eine Überschrift (vermutlich ne TextView) gefolgt von einer Liste von selbst erstellten Zeilen (externes XML-File). Und das ganze zwei mal untereinander. Bisher konnte ich es nur mit TableLayouts realisieren, dass es sich verhielt, wie ich wollte. Wenn ich zwei ListViews untereinander mache, dann komm ich nie zur zweiten, wenn die erste bereits die Höhe des Screens einnimmt. Was soll ich bloß tun? Im Endeffekt gehts mir "nur" darum ein ContextMenü auf diesen Listenelementen zu haben...
     
    Zuletzt bearbeitet: 17.10.2011
  13. heinzihogo, 19.10.2011 #13
    heinzihogo

    heinzihogo Neuer Benutzer

    Beiträge:
    1
    Erhaltene Danke:
    0
    Registriert seit:
    19.10.2011
    Ich habe dasselbe Problem und habe gerade das hier gefunden. Da hat anscheinend jemand unser Problem gelöst.
    Nur ich kanns nicht nachvollziehen, bei mir besteht mit seiner "Lösung" das Problem (in onContextItemSelected() kommt aus item.getMenuInfo() nur ein null heraus) weiterhin.

    Vielleicht verstehst du seine Lösung besser.
     
  14. witschi87, 19.10.2011 #14
    witschi87

    witschi87 Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    05.10.2011
    das ist ja auch keine Lösung. Ich bin inzwischen soweit, zu akzeptieren, dass item.getMenuInfo() nunmal NULL ist, wenn man keine ListView hat. Du musst halt bei jeder TableRow ein registerForContextMenu() machen, dann öffnet sich das ContextMenü und du kannst über den Parameter v (View) herauskriegen, welche TableRow lange gedrückt gehalten wurde. Ich habs nun über globale Variablen gelöst (ist allerdings auch nur ein Workaround). Anders wirst du von der onContextItemSelected()-Methode nicht rauskriegen, welche TableRow selektiert wurde.
     

Diese Seite empfehlen