簡體   English   中英

Gluon 移動應用 NavigationDrawer 后退按鈕問題

[英]Gluon mobile app NavigationDrawer back button issue

我正在處理一個帶有 FXML 的多視圖項目,該項目由 IntelliJ 的 Gluon 插件生成。

當我從主視圖導航到輔助視圖時,我按下物理 android 設備上的后退按鈕,視圖變回主視圖。 這是正常行為。

問題是 NavigationDrawer 停留在輔助視圖上。 您可以觀察到這一點,因為您將無法導航到輔助視圖。 當您在導航窗格中推送次要時,什么也不會發生。 此行為類似於嘗試導航到您當前所在的頁面,但也不會執行任何操作。

有誰知道解決方案? 這是一個錯誤嗎? 為 Gluon 報告錯誤的最佳方式是什么,因為他們不想將所有支持轉移到 SO?

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);
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM