Прослушивание события нажатия на боковое меню / меню гамбургера

#codenameone

#codenameone

Вопрос:

Я хотел бы определить, когда нажимается боковое меню или меню гамбургера.

Вот код из проекта barebone hello world, который не работает:

     Form hi = new Form("Hi World");
    Toolbar bar = new Toolbar();
    hi.setToolbar(bar);
    bar.addCommandToSideMenu(new Command("test 1"));
    bar.addCommandToSideMenu(new Command("test 2"));
    hi.addComponent(new Label("Hi World"));

    bar.getMenuBar().addPointerPressedListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent evt) {
           System.out.println("Side menu or Hamburner Menu is clicked");
        }
    });
    hi.show();
  

Я ожидал, что при нажатии на боковое меню или меню гамбургера появится строка, напечатанная. Но это было не так.

Как я могу прослушать событие нажатия на меню гамбургера.

Спасибо,

3lix

Ответ №1:

Поскольку панель инструментов представляет собой просто контейнер BorderLayout в верхней части формы, вы можете найти кнопку бокового меню и добавить к ней прослушиватель.

 Button sideBtn = (Button)((BorderLayout)bar.getLayout()).getEast();
  

Обратите внимание, что это недокументированный API, поэтому в будущем это может сломаться, боковая кнопка не отображается специально по какой-то причине, пересмотрите то, что вы пытаетесь сделать.

Комментарии:

1. Ну, я не совсем понимаю, почему боковая кнопка вообще не отображается специально. Я не понимаю, почему вы не поддерживаете прослушивание для открытия события бокового меню, возможно, через вызов api. Я бы пересмотрел то, что я пытаюсь сделать, если вы можете направить меня к лучшему подходу. Короче говоря, я пытаюсь изменить форму закрытия при открытии бокового меню, а затем развернуть ее при закрытии бокового меню. Для целей тонирования / удаления я заполняю прямоугольник на стеклопакете. Мой случай ни в коем случае не является ограничителем показа, но мне нравится визуальная подсказка, намекающая на то, что форма не в фокусе

2. Пожалуйста, дайте мне знать, если у вас есть какие-либо предложения (лучший подход ко мне) или если вы думаете, что мы, возможно, сможем в будущем предоставить вызов API для этого, если на самом деле вы видите вариант использования для этого, который может понадобиться другим людям. Я хотел бы добавить, что я также определяю, когда открывается меню, чтобы выделить последнюю выбранную опцию / команду в боковом меню прямо перед открытием бокового меню. Это два обычных варианта использования, которые у меня есть до сих пор.

3. Я думаю, вы имели в виду getWest(). Я не могу получить более одного события. Это работает в первый раз, но затем перестает работать: Кнопка sideBtn = (Кнопка)((BorderLayout)bar.getLayout()).getWest(); sideBtn.addActionListener(новый ActionListener(){ @Переопределение общедоступного недействительного actionPerformed(ActionEvent evt) { System.out.println(«Боковое менюили нажато меню гамбургера «); } }); Я начал лучше понимать ваши проблемы прямо сейчас. Я думаю, что к боковой кнопке также прикреплены другие события для открытия / закрытия бокового меню.

4. Кроме того, меню фактически реализовано в другой форме, поэтому попытка разместить что-либо на оригинальном стекле может быть сложной. Это звучит как функция для самого SideMenu, я бы предположил, что это тонирование также должно изменять его альфа-значение при перетаскивании. Боюсь, для этого потребуется некоторая настройка в реализации бокового меню, вы можете подать RFE или разветвить проект на github, реализовать его и отправить запрос на извлечение

5. Я хотел бы отметить, что, если боковая кнопка не отображается по какой-либо причине, тогда API должен компенсировать это, сделав доступным слушателя. Довольно стандартно для API-интерфейсов GUI предоставлять слушателям такие события, как появление меню, и это расстраивает, что CodenameOne этого не делает. Подход слушателя также упростит переписывание кода бокового меню без нарушения работы существующих приложений. Мне также нужно было прослушать события бокового меню, и мне пришлось написать какой-то запутанный код, чтобы обойти дизайн. API, который заставляет разработчиков писать запутанный код, следует немного переосмыслить.

Ответ №2:

Другим подходом было бы отключить значок бокового меню и просто добавить кнопку самостоятельно, как мы сделали в этом шаблоне: http://www.codenameone.com/blog/template-mobile-material-screens-ui-kit.html

Комментарии:

1. Я вижу! Это очень интересный подход! Спасибо за помощь. Я думаю, что ваш ответ решает проблему