web-dev-qa-db-fra.com

Est-il possible d'envoyer des arguments autres que chaîne ou entier dans le nouveau composant de navigation d'Android

Le nouveau composant de navigation est génial! Cependant, j'aimerais envoyer des variables "longues" entre mes fragments.

écrire ceci dans le fichier graphique de navigation fonctionne:

<argument
        Android:name="discussionId"
        app:type="string" />

écrire ceci ne compilera pas:

<argument
        Android:name="discussionId"
        app:type="long" />

Actuellement, il semble que je sois obligé de les analyser de et au format de chaîne . Cela fonctionne bien, mais il me semble bizarre que je ne puisse pas utiliser de types primitifs tels que long, byte ou short pour une architecture aussi fondamentale . Est-ce que je manque quelque chose? Ce type de fonctionnalité doit-il être développé dans le futur?

5
MichaelThePotato

Depuis la version 1.0.0-alpha08, vous pouvez utiliser beaucoup de types différents, j'ai trouvé une liste ici

"integer" -> IntType
"integer[]" -> IntArrayType
"long" -> LongType
"long[]" -> LongArrayType
"float" -> FloatType
"float[]" -> FloatArrayType
"boolean" -> BoolType
"boolean[]" -> BoolArrayType
"reference" -> ReferenceType
"reference[]" -> ReferenceArrayType
"string" -> StringType
"string[]" -> StringArrayType
null -> StringType

et pour le graphe de navigation utilisé (par exemple: liste de chaîne)

<argument
    Android:name="photo_url"
    app:argType="string[]"
/>
0
Guillaume

Il suffit de définir la valeur par défaut 0L au lieu de 0 et le type "inféré"

0
AfzalivE

Cela pourrait arriver en retard et résoudre le problème de manière légèrement différente, mais je le pose ici car j'estime que la question demande un moyen de transmettre les arguments lors de la navigation et à une magnitude nominale de manière sûre.

Le fait que mon ami soit l’un des problèmes rencontrés modèle de vue des composants d’architecture est résolu de manière très efficace. Comme indiqué dans la section { docs _, nous allons trouver la technique utilisée dans la section "partage des données entre fragments". Il s’agit essentiellement de créer une instance de modèle de vue qui est plutôt liée à la portée du fragment/activité englobant les deux (ou plus) objets parcourus. De cette façon, ils survivront tout au long du cycle de vie des fragments navés.

Vous trouverez ci-dessous un petit exemple que j'ai extrait d'une des applications de la production.

-MainActivity |-NavHostFragment | |-FormFragment(Start destination) | |-ResultFragment( navigated to fragment) | | et un SharedViewModel pour le transfert de données entre les fragments de destination.

ViewModelCode

public class SharedViewModel extends ViewModel implements ResultFragment.ResultFragmentViewModel, FormFragment.FormFragmentViewModel {
public String name;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}   }

dans FormFragment.

    @Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    sharedViewModel = ((FormFragmentViewModel) ViewModelProviders.of(this.getActivity()).get(SharedViewModel.class));
}

public void onFabPressed( View view) {
    String text = editText.getText().toString().trim();
    if(text.matches("")) return ;
    sharedViewModel.setName(text);
    Navigation.findNavController(view).navigate(R.id.action_formFragment_to_resultFragment);

}

public interface FormFragmentViewModel {
    public void setName(String string);
}

dans le ResultFragment,

    @Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    sharedViewModel = ((ResultFragmentViewModel) ViewModelProviders.of(this.getActivity()).get(SharedViewModel.class));
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_result, container, false);
    FloatingActionButton fab = view.findViewById(R.id.fab);
    ((TextView) view.findViewById(R.id.textview))
        .setText(sharedViewModel.getName());
    fab.setOnClickListener(
            Navigation.createNavigateOnClickListener(R.id.action_global_formFragment)
    );
    return view;
}


public interface ResultFragmentViewModel {
    public String getName();
}

Dans les éléments de code ci-dessus, il convient de mettre l'accent sur la portée envoyée à la méthode ViewModelProviders.of (), les deux fragments constituant l'activité englobante car son cycle de vie survit à celui des deux fragments (FormFragment, ResultFragment). Sauvegarde des données que nous souhaitons envoyer au fragment de destination dans le modèle de vue avant de naviguer vers le fragment de destination, sachant que nous allons les récupérer à partir de la même instance du modèle de vue une fois dans le fragment de destination . Les interfaces sont utilisées avec intellisense avec Android studio, faisant abstraction (du point de vue du développeur) des méthodes inutiles du modèle de vue correspondant au fragment dans lequel il est utilisé. Dans cette configuration, même les actions peuvent être envoyées au fragment de destination en utilisant quelque chose comme un modèle de délégué } _ en définissant l'objet pour que l'action soit exécutée une fois dans le fragment de destination du modèle de vue avant de naviguer dans le fragment de destination et, le cas échéant, récupère l'objet et lui délègue l'action à exécuter. Je voudrais ajouter que dans cette configuration, il est presque impossible pour quiconque de confondre la variable String name pour un int.

J'espère que cela t'aides.

0
yonga springfield