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);
});
}
謝謝José,它工作! – progonkpa