2016-06-18 2 views
10

Wie kann ich einen Long-Klick-Listener auf einem MenuItem festlegen?Wie wird ein Long-Klick-Listener auf einem MenuItem (in einer NavigationView) festgelegt?

Ich versuchte this answer, aber die Methode existiert nicht für mich. Irgendwelche Lösungen?

Code:

Menu menu = navigationView.getMenu(); 
MenuItem menuItem = menu.findItem(R.id.menu_item); 

// TODO set a long click listener on the menuItem. 
menuItem.setOnLongClickListener(...); // Method does not exist, any other solutions? 

Edit: ich keine benutzerdefinierte ActionView einstellen wollen, möchte ich die lange klicken Zuhörer auf das gesamte MenuItem, ohne eine benutzerdefinierte Ansicht.

+0

zeigen Sie Ihren Code bitte – BooDoo

+0

@BooDoo Es gibt nicht wirklich etwas zu zeigen, aber ich habe etwas Code hinzugefügt. –

+0

http://StackOverflow.com/Q/23151117/6152781 – BooDoo

Antwort

5

eine von vielen Möglichkeiten (vorausgesetzt, wir Toolbar verwenden) - dieses Beispiel sollten Sie die Idee geben, wie lange, klicken Sie auf Symbolleiste auf die Schaltfläche implementieren:

class MyActivity extends Activity {  

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     /** get menu inflater */ 
     MenuInflater menuInflater = getMenuInflater(); 
     /** Inflate the menu 
     * this adds items to the action bar if it is present. */ 
     menuInflater.inflate(R.menu.menu_home, menu); 
     /** find interesting item */ 
     MenuItem item = menu.findItem(R.id.itemId); 
     /** set action view */ 
     item.setActionView(new ImageButton(this)); // this is a Context.class object 
     /** set listener on action view */ 
     item.getActionView().setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       return false; 
      } 
     }); 

     return super.onCreateOptionsMenu(menu); 
    } 
} 

in Verfahren onCreateOptionsMenu - oder jede andere Methode, wenn Sie können

  1. erstellen Menü/zum Beispiel durch aufblasen
  2. get Menüpunkt
  3. : Menüpunkt Referenz (weglassen Schritt 1-2)
    erhalten
  4. Aktion Ansicht erstellen zum Beispiel Image
  5. Blick auf Aktion langen Klick-Listener
  6. Satz auf eine Aktion Ansicht Menüpunkt

oben i eine Aktion Ansicht verwendet dann ich es wieder aus dem Menüpunkt und stellen Sie Zuhörer (die Reihenfolge ist egal es könnte auch so sein):

ImageButton imageButton = new ImageButton(Context); 
imageButton.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       return false; 
      } 
     }); 
item.setActionView(imageButton); 

ps.

<item 
    ... 
    android:actionViewClass="android.widget.ImageButton" 
/> 

then you can get the action view by cast 

    View menuItemActionView = menu.findItem(R.id.itemId).getActionView(); 
    if(menuItemActionView != null 
      && ImageButton.class.isAssignableFrom(menuItemActionView.getCLass())) { 
     ImageButton imageButton = (ImageButton) menuItemActionView; 
    } 

Aber dann stellen Sie die langen Klick Zuhörer auf die Aktion Ansicht, nicht der ganze Artikel: Sie können auch Bildansicht in XML als Attribut auf dem Menüpunkt gesetzt. - SuperThomasLab

- nicht eine Aktion Blick auf einzelne Element in diesem Fall setzen Sie eine Standardansicht ändern (zu Image Widget) für einen Menüpunkt - Aktion Ansicht könnte sein, einfach oder komplex Ansichtsart

Aber was, wenn Sie die Ansicht nicht ändern möchten, aber die Standardansicht beibehalten? - SuperThomasLab

Beispiel (dies ist eine Möglichkeit von vielen durch ein Layout Baum Beobachter mit/durch eine Änderung des Layouts Listenereinstellung):

private View.OnLongClickListener onLongClickListener = new View.OnLongClickListener() { 
     @Override 
     public boolean onLongClick(View v) { 
      return false; 
     } 
    }; 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     /** get menu inflater */ 
     MenuInflater menuInflater = getMenuInflater(); 
     /** Inflate the menu 
     * this adds items to the action bar if it is present. */ 
     menuInflater.inflate(R.menu.menu_home, menu); 
     /** geta menu item using findItem(int itemid) */ 
     MenuItem item = menu.findItem(R.id.itemLogOut); 
     /** check if we have item */ 
     if(item!=null) { 
      /** try get its action view */ 
      View actionView = item.getActionView(); 
      /** check if action view is already set? */ 
      if(actionView==null) { 
       /** get item id to comparte later in observer listener*/ 
       final int itemId = item.getItemId(); 
       /** if not set on top most window an layout changes listener */ 
       getWindow().getDecorView() 
          .addOnLayoutChangeListener(new View.OnLayoutChangeListener() { 
        @Override 
        public void onLayoutChange(View v, int left, int top, int right, 
         int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
          /** try get view by id we have stored few line up */ 
          View viewById = v.getRootView().findViewById(itemId); 
          /** check if we have any result */ 
          if(viewById!=null) { 
           /** set our listener */      
           viewById.setOnLongClickListener(onLongClickListener); 
           /** remove layout observer listener */ 
           v.removeOnLayoutChangeListener(this); 
          } 
        } 
       }); 
      } else { 
       /** if set we can add our on long click listener */ 
       actionView.setOnLongClickListener(onLongClickListener); 
      } 
     } 
    } 

Ich versuchte, die OnLayoutChangeListener , aber es funktioniert immer noch nichts Nichts geändert.- SuperThomasLab

Ja, es funktioniert - aber ich weiß den Grund, warum it't ist in Ihrem Fall arbeiten ??? - in meinem Beispiel überprüfen wir, ob Artikel ansehen anstelle dieser Änderung aus gelegt wird, wenn Menüansicht gelegt wird und dann prüfen, ob Menüpunkt

hier arbeitet Code enthalten, die für Sie zu studieren:

https://github.com/c3ph3us/LongClickOnMenuItem

in Antwort auf andere Kommentare:

@ SuperThomasLab ist es für mich nicht ersichtlich, warum setOnLongClickListener (...) Methode für Sie nicht verfügbar. - Hossein Seifi

@HosseinSeifi - bei android.view.MenuItem Schnittstelle aussehen - es ist nicht ein solches Verfahren bereitstellt - so für gute Programmierer dies sollte klar sein :), warum er nicht erreichen kann die Umsetzung Klassenmethode.

+0

Vielen Dank für Ihre Antwort. Aber wo ist der Long-Klick-Listener? Und wie soll ich das auf ein 'MenuItem' setzen? –

+0

@SuperThomasLab - siehe meine bearbeitete Antwort – ceph3us

+0

Aber dann setzen Sie den Long-Klick-Listener nur auf die Aktionsansicht, nicht das gesamte Element. –

0

Sie können dies erreichen, indem Sie:

action_menu.xml 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:support="http://schemas.android.com/apk/res-auto" > 

<item 
    android:id="@+id/item1" 
    support:showAsAction="always"> 
</item> 

custom_action_view.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_margin="10dp" 
    android:paddingRight="5dp" > 

<ImageButton 
    android:id="@+id/customActionItem" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerVertical="true" 
    android:background="@drawable/abc_item_background_holo_dark" 
    android:src="@drawable/bulb_icon" /> 

</RelativeLayout> 

und Menü inflater Code wie folgt lautet:

public boolean onCreateOptionsMenu(Menu menu) { 
    // TODO Auto-generated method stub 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.action_menu, menu);  

    final MenuItem item1= menu.findItem(R.id.item1); 
    MenuItemCompat.setActionView(item1, R.layout.custom_action_view); 
    View vItem1= MenuItemCompat.getActionView(item1); 

    final ImageButton customActionItem= (ImageButton) vItem1.findViewById(R.id.customActionItem); 
    customActionItem.setOnLongClickListener(new OnLongClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      // do something here 
     } 
    }); 

    return super.onCreateOptionsMenu(menu); 
} 
+0

Dies ist das gleiche wie die andere Antwort. Ich don Ich möchte keine benutzerdefinierte ActionView.Ich möchte den Long-Click-Listener auf das normale Element ohne benutzerdefinierte Ansicht festlegen. –

Verwandte Themen