Мобильное приложение Gluon NavigationDrawer выдает кнопку возврата
Я работаю с проектом множественного представления с FXML, сгенерированным плагином Gluon для IntelliJ.
Когда я перехожу к дополнительному представлению, исходящему из основного представления, и нажимаю кнопку "Назад" на моем физическом устройстве Android, представление возвращается к основному виду. Это нормальное поведение.
Проблема в том, что NavigationDrawer остается во вторичном представлении. Вы можете наблюдать это, потому что вы не сможете перейти к дополнительному виду. Когда вы нажимаете вторичный на панели навигации, ничего не происходит. Это поведение похоже на попытку перейти на страницу, на которой вы находитесь в данный момент, что также ничего не делает.
Кто-нибудь знает решение? Это ошибка? Какой лучший способ сообщить об ошибках в Gluon, потому что они не хотят переводить всю поддержку в SO?
1 ответ
NavigationDrawer
в основном это всплывающее окно со списком элементов, где обычно каждый из этих элементов позволяет выбрать View
,
Если к представлениям можно получить доступ только через ящик, то у вас не возникнет никаких проблем, поскольку всегда выбранный элемент будет связан с активным видом.
Проблема, с которой вы сталкиваетесь, когда вы получаете доступ к представлениям другими способами, например кнопкой "Назад".
По умолчанию список ящиков не отслеживает активный вид для автоматического выбора связанного элемента. Если позже вы попытаетесь выбрать элемент, который уже выбран, слушатель не будет переключать режимы просмотра.
Несмотря на то, что это может быть сделано изнутри элементом управления (входящие версии, вероятно, будут управлять этим), этого легко достичь.
Просто добавьте слушателя viewProperty()
в вашем основном классе, и всякий раз, когда вид меняется, обновляйте выбранный элемент в ящике. Так как это вызовет изменение в navigationDrawer.selectedItemProperty()
Перед обновлением выделения нам нужно удалить слушателя и добавить его снова.
public static final String PRIMARY_VIEW = HOME_VIEW;
public static final String SECONDARY_VIEW = "Secondary View";
public static final String MENU_LAYER = "Side Menu";
private Item primaryItem;
private Item secondaryItem;
private final ChangeListener listener = (obs, oldItem, newItem) -> {
hideLayer(MENU_LAYER);
switchView(newItem.equals(primaryItem) ? PRIMARY_VIEW : SECONDARY_VIEW);
};
@Override
public void init() {
addViewFactory(PRIMARY_VIEW, () -> new PrimaryView(PRIMARY_VIEW).getView());
addViewFactory(SECONDARY_VIEW, () -> new SecondaryView(SECONDARY_VIEW).getView());
NavigationDrawer drawer = new NavigationDrawer();
primaryItem = new Item("Primary", MaterialDesignIcon.HOME.graphic());
secondaryItem = new Item("Secondary", MaterialDesignIcon.DASHBOARD.graphic());
drawer.getItems().addAll(primaryItem, secondaryItem);
primaryItem.setSelected(true);
drawer.selectedItemProperty().addListener(listener);
addLayerFactory(MENU_LAYER, () -> new SidePopupView(drawer));
viewProperty().addListener((obs, ov, nv) -> {
drawer.selectedItemProperty().removeListener(listener);
if (nv.getName().equals(PRIMARY_VIEW)) {
primaryItem.setSelected(true);
secondaryItem.setSelected(false);
drawer.setSelectedItem(primaryItem);
} else {
primaryItem.setSelected(false);
secondaryItem.setSelected(true);
drawer.setSelectedItem(secondaryItem);
}
drawer.selectedItemProperty().addListener(listener);
});
}