2016-03-25 1 views
1

Je travaille avec un projet multi-vues avec FXML, généré par le plugin Gluon pour IntelliJ.Gluon application mobile NavigationDrawer retour bouton numéro

Lorsque je navigue vers la vue secondaire, en provenance de la vue principale et que j'appuie sur le bouton Précédent de mon périphérique Android, la vue revient à la vue principale. C'est un comportement normal.

Le problème est que le NavigationDrawer reste sur la vue secondaire. Vous pouvez observer cela parce que vous ne serez pas en mesure de naviguer vers la vue secondaire. Lorsque vous appuyez sur secondaire dans le volet de navigation, rien ne se passe. Ce comportement est similaire à celui d'essayer de naviguer vers la page sur laquelle vous êtes actuellement, ce qui ne fait rien non plus.

Est-ce que quelqu'un connaît une solution? Est-ce un bug? Quelle est la meilleure façon de rapporter les bugs pour Gluon parce qu'ils ne veulent pas tout supporter à SO?

Répondre

1

Le NavigationDrawer est essentiellement un popup avec une liste d'éléments, où habituellement chacun de ces éléments permet la sélection d'un View.

Si les vues ne sont accessibles que par le tiroir, alors vous n'aurez aucun problème, étant donné que l'élément sélectionné sera toujours lié à la vue active.

Le problème que vous rencontrez se produit lorsque vous accédez à des vues par d'autres moyens, tels que le bouton Précédent.

Par défaut, la liste de tiroirs ne suit pas la vue active pour sélectionner automatiquement l'élément associé. Si plus tard, vous essayez de sélectionner un élément déjà sélectionné, l'écouteur ne déclenchera pas le basculement des vues.

Bien que cela puisse être fait en interne par le contrôle (les versions entrantes gèreront probablement cela), c'est facile à réaliser.

Ajoutez simplement un écouteur à viewProperty() sur votre classe principale, et chaque fois que la vue change, mettez à jour l'élément sélectionné dans le tiroir. Comme cela déclenchera une modification dans le navigationDrawer.selectedItemProperty(), avant de mettre à jour la sélection, nous devons supprimer l'écouteur et l'ajouter à nouveau.

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

Merci José, ça a marché! – progonkpa