IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Instanciation dynamique d'objet


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 48
    Par défaut Instanciation dynamique d'objet
    Bonjour,

    Je suis en train de développer un manageur de fragment pour mon application (plus adapté à ce que je veux faire que le FragmentManager fourni par google).

    J'ai une méthode qui est censé récupérer en paramètre un fragment. Cependant, ce fragment peut être de n'importe quel type (du moment qu'il hérite de la classe Fragment).

    Or, dans cette méthode, j'ai besoin d'instancier ces fragments sans forcément connaitre leur type (cela peut etre un fragment de type Fragment1, Fragment2, etc...). J'ai essayé plusieurs techniques et la dernière en date est celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private void setupFragment(Class<? extends Fragment> frag) {
    		String s;
     
    		frag = frag.cast(this.mFragmentManager.findFragmentByTag(frag.getDeclaredField("TAG").toGenericString())); //c'est à cette ligne que j'ai une erreur de compilation
    		if (frag == null) {
    			 //instanciation d'un fragment
    		}
    		else {
    			//traitement
    		}
     
    	}
    quelqu'un saurait comment faire marcher ce code ?

  2. #2
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Par défaut
    Salut,

    Si je simplifie ta problématique : tu veux appeler le constructeur d'une classe dont tu peux obtenir le nom (package + nom de classe) sous forme de string ?
    Ou alors c'est déjà la récupération du nom de ta classe qui te pose problème ?

  3. #3
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 48
    Par défaut
    Concrètement, je veux manipuler des Fragments personnalisés dont je ne connais pas forcément le type (le nom de ma classe quoi, Fragment1, Fragment2, Fragment3, etc) mais dont je sais qu'ils héritent tous de la super classe "Fragment".

    Avec ces fragments passés en paramètres, je veux pouvoir tester s'ils sont "null" et si ils le sont, pouvoir les instancier selon le bon type correspondant (Fragment1, Fragment2, etc).

    Je transmets en paramètre de ma fonction ce fragment inconnu.

    J'ai modifié ma façon de penser par rapport à hier.

    j'aurais du coup deux fonctions donc j'imagine le code comme ceci :
    la première :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private Fragment getExistingFragmentFromTag(Class<? extends Fragment> fragType){
     
    		try {
    			return fragType.cast(this.mFragmentManager.findFragmentByTag(fragType.getDeclaredField("TAG").toGenericString()));
    		} catch (NoSuchFieldException e) {
     
    			e.printStackTrace();
    			return null;
    		}
    	}
    je veux récupérer le fragment correspondant via un tag selon le type du fragment, type passé en paramètre.

    la deuxième fonction serait une sorte de getInstance, en mode singleton. Je passe un fragment en paramètre (un fragment pouvant avoir comme type Fragment1, Fragment2, etc) et s'il est null, je l'instancie, s'il est déja instancié, je le retourne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	private Fragment setupFragment( ? ? ? ? myFragment) { 
     
    		if (frag == null) {
    			 return  ???????
    		}
    		else {
    			return myFragment;
    		}
     
    	}

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Bon... alors plein de truc me viennent à l'esprit en lisant le code:

    Beurk !
    D'autant que si cela ne marche pas il faut que le dev. soit au courant (un throw new IllegalStateException("Pas de TAG défini dans "+fragType,ex); me semble donc plus judicieux qu'un passage sous silence de l'exception et un "return null" qui ne fera pas la différence entre "y a pas le fragment" et "y a une erreur".

    Bon... ceci étant dit...

    Pour la deuxième partie, une simple hashmap devrait suffire....
    Attention par contre aux problèmes de fuite mémoire. En faisant ainsi il est fort possible de locker le context forever... à toi de voir.

    static HashMap<Class<? extends Fragment>,Fragment> fragmentsCache;

  5. #5
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 48
    Par défaut
    Oui oui, bien sur que je ne vais pas laisser le e.printstacktrace. C'est juste du auto-généré par eclipse et que je n'ai pas encore changé puisque l'important est surtout voir si mon try fonctionnait, la gestion d'erreur se fait juste après ^^.

    Donc je vois à peu près comment faire pour le coup. Je sais pas si j'vais utiliser une hashMap puisque je ne passerais qu'un fragment à la fois, mais pourquoi pas diviser ce fragment en deux paramètres, le fragment en lui-même et un objet de type classe représentant la classe du fragment transmis. ça devrait fonctionner.


    sinon peux-tu m'expliquer le souci "de locker le context forever" ? ainsi que les éventuelles fuites mémoires ? Je ne suis pas tant que ça familier avec android, c'est ma première grosse application (mais je veux faire les choses bien) et du coup je ne comprends pas trop les soucis qui pourraient arriver en faisant ça...

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Un fragment contient des "View"
    Les "View" pointent sur un context
    Le contexte en l'occurence est l'activité.

    Si l'activité pointe sur la HashMap qui elle même point sur les Fragments.... tu vois le problème de références.... Les références circulaires ne sont pas un problème, Java utilisant les "piles d'execution" comme références de départ, tous les objets seront bien détruits à condition *qu'aucun objet statique ou référencé dans la pile" ne pointe sur un seul petit élément de cet ensemble.

    Donc en gros, déjà, éviter toute valeur "statique".

Discussions similaires

  1. Instanciation dynamique d'objets
    Par ToTo13 dans le forum Général Java
    Réponses: 11
    Dernier message: 08/01/2014, 21h27
  2. Instanciation dynamique plusieurs objets
    Par mdrhaha dans le forum C++
    Réponses: 5
    Dernier message: 27/09/2010, 16h38
  3. Instanciation et destruction dynamique d'objet
    Par mulfycrowh dans le forum Visual C++
    Réponses: 5
    Dernier message: 15/10/2009, 11h01
  4. création dynamique d'objet, projet win32
    Par noinneh dans le forum MFC
    Réponses: 5
    Dernier message: 03/02/2005, 16h07
  5. [Reflexivite]création dynamique d'objet et Héritage
    Par norkius dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 26/10/2004, 11h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo