#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. Я вижу! Это очень интересный подход! Спасибо за помощь. Я думаю, что ваш ответ решает проблему