Android открывает ContextMenu при коротком щелчке + передает информацию о нажатом элементе

 lv.setOnItemClickListener(new OnItemClickListener() {
             @Override
          public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
              TextView text = (TextView) view.findViewById(R.id.btitle);
              registerForContextMenu(text);
              view.showContextMenu();
              }
            });
       }

     @Override
     public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
       super.onCreateContextMenu(menu, v, menuInfo);
       TextView text = (TextView) v.findViewById(R.id.btitle);
       CharSequence itemTitle = text.getText();
       menu.setHeaderTitle(itemTitle);

       MenuInflater inflater = getMenuInflater();
       inflater.inflate(R.menu.context_menu, menu);

     }

Привет,

Я пытаюсь открыть contextMenu при коротком щелчке элемента. Мне удалось сделать это, только если я где-нибудь добавлю registerForContextMenu(getListView());, но это также запускает contextMenu при долгом щелчке (чего я не хочу).

  • Пробовал view.showContextMenu(), но он ничего не делает, пока я не добавлю registerForContextMenu(getListView()); .
  • Сначала попытался зарегистрировать выбранный элемент, а затем вызвать showContextMenu(), но ничего не сделал...

Кроме того, я хочу получить изображение + текст щелкнутого элемента, чтобы я мог использовать их в contextMenu.

Цените помощь!


person Lior Iluz    schedule 15.09.2010    source источник


Ответы (6)


Мне удалось открыть контекстное меню при нажатии кнопки со следующим кодом:

public void onButtonClickEvent(View sender)
{
    registerForContextMenu(sender); 
    openContextMenu(sender);
    unregisterForContextMenu(sender);
}

Просто установите для свойства onClick кнопки значение onButtonClickEvent. Длинный щелчок не вызывает контекстное меню, так как оно отменяет регистрацию сразу после отображения.

person Konrad    schedule 03.11.2011
comment
@konrad... Превосходно... Отличная помощь!! :) - person Noman; 19.07.2012
comment
+1 - мне это нужно было для того, чтобы сделать строку таблицы доступной для кликов, я сделал свою работу, большое спасибо! - person AgentKnopf; 13.01.2013
comment
Просто сэкономил мне кучу времени. Мне нужно было вызвать быстрое контекстное меню коротким щелчком мыши. Этот ответ должен быть принят ОП. - person Jerry Brady; 04.02.2013
comment
Обратите внимание, что в случае ListView отправителем должен быть ваш listView, а не вид вашего элемента, иначе у вас будут плохие времена. - person Dimillian; 28.01.2014
comment
Работает отлично для меня СПАСИБО, Сэр! - person dsdsad; 24.11.2014
comment
Как это решает проблему, когда ContextMenu не получает идентификатор элемента, изображение и текст? - person CoolMind; 14.01.2019

Относительно открытия контекстного меню по короткому клику:

Другие решения, размещенные здесь, не сработали для меня, потому что я использовал ListFragment. Однако следующее решение, кажется, работает довольно хорошо как для ListFragment, так и для ListActivity (или вообще любого старого списка):

public void onListItemClick(ListView l, View v, int position, long id){
  l.showContextMenuForChild(v);   
}

Это намного проще и элегантнее. На самом деле, именно так сам класс ListView инициирует контекстное меню по долгому щелчку.

person Kurtis Nusbaum    schedule 15.01.2012
comment
Хотя это решение, которое я искал (+1!), Похоже, оно не соответствует тому, что искал ОП, поскольку контекстное меню по-прежнему будет отображаться при долгом щелчке. - person Blumer; 15.02.2012
comment
@Blumer Да, я знаю:/ Но поскольку в заголовке вопроса не упоминается это предостережение, я решил опубликовать свое решение для таких людей, как вы и я, которые наткнулись бы на этот вопрос без этого требования. - person Kurtis Nusbaum; 16.02.2012
comment
+1 Использование l.showContextMenuForChild(v) вместо openContextMenu(l) при вызове item.getMenuInfo() в onContextItemSelected вернет действительный AdapterContextMenuInfo. - person tidbeck; 23.02.2012
comment
Отличное решение. На самом деле, если вы также используете режим действия для длительного нажатия, режим действия переопределяет события для контекстного меню. Итак, теперь у меня есть щелчок по элементу для контекстного меню и одновременное длительное нажатие для режима действия. Спасибо! - person X.Y.; 30.05.2013

Решение:

@Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
      super.onCreateContextMenu(menu, v, menuInfo);
      MenuInflater inflater = getMenuInflater();
      inflater.inflate(R.menu.context_menu, menu);

      AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo;
      long itemID = info.position;
      menu.setHeaderTitle("lior" + itemID);
    }

AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo;

дает вам более подробную информацию о выбранном элементе списка. Затем вы можете использовать info.id, info.position и так далее, чтобы получить детали и использовать их действия (редактировать, удалить...).

person Lior Iluz    schedule 16.09.2010
comment
Спасибо за это ! я использовал это, чтобы получить элемент, щелкнутый из пользовательского адаптера. - person Aadi Droid; 26.02.2012
comment
Вероятно, это работает в ListView, но в моем случае (RecyclerView) он вернул null в menuInfo. Но спасибо за направление. - person CoolMind; 14.01.2019

В моем случае у меня был BaseAdapter и реализовано нажатие кнопки для каждого элемента listView (в методе getView):

ImageButton menuBtn = (ImageButton) convertView.findViewById(R.id.itemListMenu);
menuBtn.setOnClickListener(new android.view.View.OnClickListener() {
    public void onClick(View v) {
        parent.showContextMenuForChild(v);
    }
 });
person Shay Zalman    schedule 26.02.2016

Я считаю, что если вы добавите в представление OnLongClickListener, вы должны иметь возможность предотвратить отображение контекстного меню при длительном щелчке.

В onItemClick параметр view является представлением элемента, поэтому вы должны иметь возможность получить из него ImageViews или TextViews:

view.findById(R.id.my_image_view);
person Cheryl Simon    schedule 15.09.2010
comment
Привет, Майра, я знаю... но почему-то не получается. нет принудительного закрытия.. просто показывает детали первого элемента в списке. - person Lior Iluz; 16.09.2010
comment
public void onCreateContextMenu (меню ContextMenu, View v, ContextMenuInfo, menuInfo) { super.onCreateContextMenu (menu, v, menuInfo); Текст TextView = (TextView) v.findViewById(R.id.btitle); меню.setHeaderTitle(text.getText()); ........ } Получает только заголовок первого элемента, а не элемент, по которому щелкнули. - person Lior Iluz; 16.09.2010
comment
Вы должны делать это в onItemClick, а не в onCreateContextMenu. - person Cheryl Simon; 16.09.2010
comment
Я должен установить заголовок contextMenu в onItemClick???? еще до создания contextMenu? menu.setHeaderTitle возможно только в onCreateContextMenu. - person Lior Iluz; 16.09.2010
comment
Хм, так представление, которое передается в onCreateContextMenu, является первым элементом в ListView? Я думаю, вы можете путать методы контекстного меню для действия и для списка. Вы можете попробовать использовать list showContextMenuForChild для отображения контекстного меню. - person Cheryl Simon; 16.09.2010
comment
Нет... читал об этом в документации Android API... пробовал... не помогло. Я изменил его на длинный щелчок, открывающий contextMenu, а один щелчок позволяет сортировать элементы, но это тоже не помогло ... по-прежнему отображаются только детали первого элемента в списке. :/ - person Lior Iluz; 16.09.2010
comment
Решил это. В любом случае спасибо! :) - person Lior Iluz; 16.09.2010

Мое решение:

    mListView.setOnItemClickListener(new AdapterView.OnItemClickListener()
    {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id)
        {               
            mListView.showContextMenuForChild(view);
        }
    });
person Nicola    schedule 19.09.2014