Pull to refresh

Comments 9

Не вопрос, а, быть может, небольшое предложение/дополнение.
Вызывать invalidate, чтобы полностью перестроить меню необязательно. Можно в onCreateOptionsMenu сохранить ссылку на Menu.
Тогда потом в любой момент можно обратиться по id к любому элементу меню и изменить нужный. Например, в каком-то фрагменте скрыть какой-нибудь пункт или же наоборот — отобразить доселе скрытый.
Здесь, скорее, другое имелось в виду. Необходимость пересоздать меню, без пересоздания Activity, т.к. первое создается вместе со вторым.
Теперь во время создания меню в методе onCreateOptionsMenu проверим доступность сети, найдем нашу кнопку и установим ей видимость. Вызываем метод invalidateOptionsMenu() нашей activity. Это приведет к повторному вызову метода onCreateOptionsMenu перед следующей отрисовкой меню.

Вызвать полное пересоздание всего меню автор предлагает. А если сохранить предварительно ссылку на Menu, как я предлагаю, придётся всего у 1 элемента видимость поменять.
Когда необходимо управлять текущими пунктами, а не пересоздавать полностью меню, то логичнее использовать onPrepareOptionsMenu.
В примере автора, следует тоже использовать onPrepareOptionsMenu, нет смысла пересоздавать меню.
Отдельное спасибо за упоминание метода onPrepareOptionsMenu, я его упустил в статье. Этот метод вызывается перед каждой отрисовкой меню, и было бы некрасиво вставлять в каждый цикл отрисовки сравнительно тяжелую операцию проверки состояния сети. Если говорить об onPrepareOptionsMenu, то тогда проверку состояния сети следует вынести в onCreate, и там выставлять boolean-флаг, который затем использовать в onPrepareOptionsMenu.
Пожалуйста.
Прятать пункты меню при отсутствие интернета изначально сомнительная затея, т.к. это будет вводить пользователя в заблуждение. Лучше увидеть сообщение о том, что нет интернета, чем недоумевать почему нет пункта меню.
Проверять в onPrepareOptionsMenu вполне приемлемо, это не такая уже и тяжелая операция. Нет смысла лишний раз слушать изменение состояния интернета, если оно нас интересует лишь в момент отображения меню. А если вынести проверку в onCreate, профита особо никакого.
Как задать кастомный фонт для пунктов меню?
Сам Android такую возможность не поддерживает. Обходные варианты: нарисовать собственный layout меню, который будет показываться или прятаться по нажатию кнопки, например в режиме диалога, также можно создавать меню кодом, используя SpannableString или переопределить функционал MenuInflater'а, чтобы в момент вызова getMenuInflater().inflate(R.menu.your_activity_menu, menu); построение UI выполнялось своим кодом, а там уже можно загрузить и установить шрифт для надписи. Подробно это описано здесь, но такой способ не будет работать с библиотекой совместимости. Такой путь усеян граблями, я бы не рекомендовал его использовать.
Sign up to leave a comment.

Articles