2016-03-25 9 views
1

私は、IntelliJ用のGluonプラグインによって生成されたFXMLを使用したマルチビュープロジェクトで作業しています。Gluonモバイルアプリのナビゲーションドローバックボタンの問題

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

問題は、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

ありがとう、ホセ! – progonkpa

関連する問題