1

IntelliJ 用の Gluon プラグインによって生成された FXML を使用した複数ビュー プロジェクトを使用しています。

プライマリ ビューからセカンダリ ビューに移動し、物理 Android デバイスの [戻る] ボタンを押すと、ビューがプライマリ ビューに戻ります。これは正常な動作です。

問題は、NavigationDrawer がセカンダリ ビューにとどまることです。セカンダリ ビューに移動できないため、これを確認できます。ナビゲーション ペインでセカンダリを押しても、何も起こりません。この動作は、現在表示しているページに移動しようとするのと似ていますが、これも何もしません。

誰かが解決策を知っていますか? これはバグですか?すべてのサポートを SO に移行したくないため、Gluon のバグを報告する最善の方法は何ですか?

4

1 に答える 1

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);
    });
}
于 2016-03-25T12:58:38.573 に答える