2016-03-25 35 views
1

我正在使用FXML的多視圖項目,由Intellion的Gluon插件生成。Gluon移動應用程序NavigationDrawer後退按鈕問題

當我導航到來自主視圖的輔助視圖,並且在我的物理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); 
    }); 
} 
+0

謝謝José,它工作! – progonkpa