Открытие контекстного меню при длительном нажатии для просмотра?

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

Проблема в том, что когда я регистрирую MapView для контекстного меню, долгое нажатие срабатывает при нажатии самого представления или узла в представлении. например он зарегистрирован для просмотра. (плохой!)

Если я не зарегистрирую контекстное меню для представления, мое долгое нажатие сработает только тогда, когда выбран узел. (хорошо!) ОДНАКО я понятия не имею, как программно отображать или запускать контекстное меню, которое не зарегистрировано первым.

Мне просто нужно отображать контекстное меню по запросу. У кого-нибудь есть предложения? Спасибо!

@Override
public void onCreate(final Bundle savedInstanceState) {
    ...
    this.mapView = (MapView) findViewById(R.id.mapview);
    this.registerForContextMenu(this.mapView); // <-- This will register the entire view for a long press context menu
    ...
}
...

class NodeGestureListener implements OnItemGestureListener<NodeOverlayItem> {
    @Override
public boolean onItemLongPress(int index, NodeOverlayItem node) {
    openContextMenu(mapView);  // <-- This won't display anything
    return false;
}
}
...

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {  
    super.onCreateContextMenu(menu, v, menuInfo);
    getMenuInflater().inflate(R.menu.node_menu, menu);
}

person dubmojo    schedule 19.04.2013    source источник


Ответы (2)


У каждого есть своя цель и структура. Так что всегда лучше использовать что-то так, как предполагается. То же самое и с меню.

В вашем случае, я думаю, если вам нужно немедленное всплывающее окно после длительного события щелчка без механизма контекстного меню, тогда лучше используйте AlertDialog.

person stinepike    schedule 19.04.2013
comment
Я правильно использую контекстное меню. Это представление, с которым я застрял, просто запускает onCreateContextMenu перед прослушивателем длительного нажатия. Существующий прослушиватель длительного нажатия MapView ведет себя по умолчанию. Я бы предпочел, чтобы этого не было, но я считаю, что было бы проще просто открыть контекстное меню, когда срабатывает долгое нажатие. - person dubmojo; 19.04.2013
comment
И AlertDialog будет недостаточно. Во-первых, я выбираю ContextMenu, чтобы можно было включить несколько опций, возможно, динамически. - person dubmojo; 19.04.2013
comment
вы можете создать свой собственный диалог с любым дизайном, который вы смотрите - person stinepike; 19.04.2013
comment
Я рассмотрю создание настраиваемого диалогового окна. Я думал, вы предлагали использовать AlertDialog с его положительными / отрицательными подсказками. - person dubmojo; 19.04.2013
comment
Я просто предложил использовать AlertDialog .. на самом деле я хотел предложить диалог для использования в этой цели. Если диалоги по умолчанию не помогают, мы определенно можем создать собственный диалог. - person stinepike; 19.04.2013
comment
Хорошо, я даю вам это предложение. В итоге я написал настраиваемый DialogFragment, который работал. Это было немного усилий, но, в конце концов, оно того стоило. - person dubmojo; 22.04.2013

Вы можете заглянуть в панель действий. Хотя он был разработан для 3.0, библиотека поддержки позволяет ему работать с гораздо более старыми вещами. docs, похоже, указывает на то, что стиль меню, который вы используете, не предпочтительнее, в то время как панель действий - лучший вариант. Бонус: я считаю, что с этим намного проще иметь дело, чем со старыми меню с длительным нажатием.

person Martin    schedule 19.04.2013
comment
Я мог бы использовать панель действий. Я ожидал, что меню может передавать больше информации, чем просто пара кнопок. Долгое нажатие предназначено для узлов на моей карте OSMdroid, поэтому я не уверен, что вы имеете в виду под старыми меню с длительным нажатием. - person dubmojo; 22.04.2013