2016-06-18 14 views
10

Как установить длинный клик на MenuItem?Как установить прослушиватель длинного клика в MenuItem (в NavigationView)?

Я пробовал this answer, но метод для меня не существует. Любые решения?

Код:

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: Я не хочу, чтобы установить пользовательские ActionView, я хочу длинный клик слушателя весь MenuItem, без пользовательского просмотра.

+0

показать код пожалуйста – BooDoo

+0

@BooDoo На самом деле ничего не видно, но я добавил код. –

+0

http://stackoverflow.com/q/23151117/6152781 – BooDoo

ответ

5

один из многих способов (предполагая, что мы используем панель инструментов) - этот пример должен дать вам идею, как реализовать долго нажмите на кнопку на панели инструментов:

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

в методе onCreateOptionsMenu - или любой другой метод, когда вы можете получить ссылку на пункт меню (опускает шаг 1-2):

  1. создать меню/например, надуть
  2. пункта меню прибудет
  3. создать вид действий для примера ImageButton
  4. набора Длинного нажатия слушателя на виде действия
  5. набор по пункту меню вида в действии

выше I установить вид действий, то я получить его обратно из пункта меню и установите (порядок не имеет значения, также может быть таким образом):

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

пс. Вы также можете установить вид изображения в формате XML в качестве атрибута по пункту меню:

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

Но затем вы установили длинный щелчок слушателя к представлению действий только, а не весь пункт. - SuperThomasLab

- не вы настраиваете с видом действия на одном элементе в этом случае изменить вид по умолчанию (для ImageButton виджета) для пункта меню - вид действия может быть простым или сложным типом зрения

Но что, если вы не хотите менять вид, но сохраняете вид по умолчанию? - SuperThomasLab

пример (это один из способов многих с использованием макета дерева наблюдателя/устанавливая изменения компоновки слушателя):

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

Я попытался OnLayoutChangeListener , но он все еще не работает. Ничего не изменилось.- SuperThomasLab

ДА ЭТО ДЕЛАЕТ - но я знаю причину, почему it't не работает в вашем случае ??? - в моем примере мы проверяем, если вид элемент выложен вместо этого изменения, если вид меню выложен, а затем проверить, если меню содержит предмет

здесь работают код для вас учиться:

https://github.com/c3ph3us/LongClickOnMenuItem

в ответ на другие комментарии:

@ SuperThomasLab это не для меня очевидно, почему метод setOnLongClickListener (...) не доступны для вас. - Хосейн Seifi

@HosseinSeifi - посмотреть на интерфейс android.view.MenuItem - это не дает такой метод - так что для хорошего программиста это должно быть очевидно :) почему он не может достичь реализации класса.

+0

Спасибо вам за ваш ответ. Но где длинный клик? И как я должен установить это в «MenuItem»? –

+0

@SuperThomasLab - см. Мой отредактированный ответ – ceph3us

+0

Но тогда вы устанавливаете прослушиватель длинного клика только в виде действия, а не на весь элемент. –

0

Вы можете достичь, делая это:

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> 

и код меню инфлятор выглядит следующим образом:

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

Это то же самое, что и другой ответ. Мне нужен пользовательский ActionView. Я хочу, чтобы длинный клик прослушивал обычный элемент без пользовательского представления. –