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 :

DialogFragment - Fragment - CallBack


Sujet :

Android

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 129
    Points : 144
    Points
    144
    Par défaut DialogFragment - Fragment - CallBack
    Bonjour à tous,

    Voilà je suis dans la constitution d'une Library perso et je rencontre quelque difficulté...
    Alors j'ai une class DialogFragmentYesNo qui extends de DialogFragment et qui contient des interfaces pour faire des retour informations ( CallBack ).

    Jusque là tout va bien mon DialogFragmentYesNo si je l'utilise dans une ActionBarActivity ça passe.

    Par contre si je l'utilise dans un Fragment là non...

    Je suis dans un projet qui a un viewPager et qui contient différent Fragment donc il faut absolument que je trouve une solution ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    L'erreur rencontré : 
     
    FATAL EXCEPTION: main
        java.lang.ClassCastException: fr.ax.volumeboster.viewPager.volumeBoosterActivity@4208e4d0 must implement OnCallBack
    J'ai cette erreur lorsque je fait dans mon DialogFragment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            try {
                mCallbacks = (CallbacksDialogFragmentYesNo) activity;
            } catch (ClassCastException e) {
                throw new ClassCastException(activity.toString() + " must implement   CallbacksDialogFragmentYesNo");
            }
        }
    Extrait de mon code du DialogFragment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
     
    public class DialogFragmentYesNo extends DialogFragment {
     
        /**
         * Callback interface through which the fragment will report the
         * task's progress and results back to the Activity.
         */
        public static interface CallbacksDialogFragmentYesNo {
            public void onClickPositiveButton();
            public void onClickNegativeButton();
        }
     
        private CallbacksDialogFragmentYesNo mCallbacks = null;
     
        Activity mContext;
        String mTitle;
        String mMessage;
        String mPositiveButton;
        String mNegativeButton;
     
        public DialogFragmentYesNo(Activity mContext) {
            this.mContext = mContext;
        }
     
        /**
         * Constructeur
         * @param mTitle
         * @param mMessage
         * @param mPositiveButton
         * @param mNegativeButton
         */
        public DialogFragmentYesNo(Activity mContext,String mTitle, String mMessage, String mPositiveButton, String mNegativeButton) {
            this.mContext = mContext;
            this.mTitle = mTitle;
            this.mMessage = mMessage;
            this.mPositiveButton = mPositiveButton;
            this.mNegativeButton = mNegativeButton;
        }
     
        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            try {
                mCallbacks = (CallbacksDialogFragmentYesNo) activity;
            } catch (ClassCastException e) {
                throw new ClassCastException(activity.toString() + " must implement CallbacksDialogFragmentYesNo");
            }
        }
     
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
            alertDialogBuilder.setTitle(mTitle);
            alertDialogBuilder.setMessage(mMessage);
            alertDialogBuilder.setPositiveButton(mPositiveButton, new DialogInterface.OnClickListener() {
     
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    mCallbacks = (CallbacksDialogFragmentYesNo) getActivity();
                    mCallbacks.onClickPositiveButton();
                    dialog.dismiss();
                }
            });
            alertDialogBuilder.setNegativeButton(mNegativeButton, new DialogInterface.OnClickListener() {
     
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    mCallbacks = (CallbacksDialogFragmentYesNo) getActivity();
                    mCallbacks.onClickNegativeButton();
                    dialog.dismiss();
                }
            });
     
     
            return alertDialogBuilder.create();
        }
     
     
    }
    Ça fonctionne parfaitement lorsque j'appel mon DialogFragment dans une ActionBarActivity mais dans un Fragment pas moyen...

    Extrait du code pour l'appel de mon DialogFragment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    DialogFragment newInstance = new DialogFragmentYesNo(mActivity);
    newInstance.show(fm,"DialogFragmentYesNo");
     
    // fm c'est mon FragmentSupportManger()
    J'ai essayé de passé mon Activity ou y'a mon pager à mon Fragment puis à mon DialogFragment mais pas moyen...

    mCallBack est soit null ou soit arrive pas à le Caster !

    L'interface est bien entendu implementer.

    Je développe sous Android Studio 0.3.4 - Gradle 1.8 - Mac OS

    Si vous auriez une astuce je suis preneur ^^

    Cordialement,

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    En lisant rapidement l'erreur, je la trouve plutôt explicite.
    Ton Activity volumeBoosterActivity doit implémenter l'interface OnCallBack

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 129
    Points : 144
    Points
    144
    Par défaut
    Merci pour ta réponse.

    Oui ça fonctionne mais j'aurais aimé rendre mon Fragment indépendant car là je suis dans un viewPager - TabHost qui est ma class VolumeBoosterActivity et qui sous divisé en 3 fragments.

    Là ça m'oblige à faire des méthodes statics dans les Fragments pour que ma class VolumeboosterActivity puisse interagir. Je trouve pas sa tip top ^^

    Après s'il n'y pas d'autre solution...

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    Eh bien je vois pas trop où est ton problème.
    Si tu défini un callback pour un Fragment, il faut que toutes les activity qui peuvent afficher ce Fragment implémentent ce callback.

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 129
    Points : 144
    Points
    144
    Par défaut
    Mon callBack est dans mon DialogFragment et moi je souhaite les utilisés dans mon Fragment et non dans mon Activity ^^


    J'ai mon activity qui appel un Fragment qui lui même appel un DialogFragment

    Dans mon fragment je souhaite savoir quand l'utilisateur clique sur oui ou non dans mon DialogFragment, avoir l'information dans l'activity ça ne me sert à rien.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    Il me semble que la communication entre Fragments est "volontairement" rendue impossible. Il faut normalement suivre ce flow :

    DialogFragment -> Activity (callback) -> Fragment

    En effet, ton Activity doit garder une référence (ou alors rechercher) le fragment à qui le callback pourra être renvoyé.

    Sinon, il me semble que tu peux t'en sortir avec la méthode setTargetFragment(android.app.Fragment, int)

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 129
    Points : 144
    Points
    144
    Par défaut
    Merci pour tes réponses.

    Cependant je rencontre encore un soucis. Voilà, j'ai suivi tes conseils j'ai utilisé un setFragmentTarget de cette manière

    Code ou j'instancie mon DialogFragment

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        DialogFragment newInstance = new DialogFragmentYesNo();
        newInstance.setTargetFragment(mFragment, 1); 
        newInstance.show(fm,"dateTimer");
    Et je récupère mon getTargetFragment dans le onActivity de cette manière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            try {
                mCallbacks = (CallbacksDialogFragmentYesNo) getTargetFragment();
            } catch (ClassCastException e) {
                throw new ClassCastException(activity.toString() + " must implement   CallbacksDialogFragmentYesNo");
            }
        }
    Ça ne plante pas mais mon DialogFragmentYesNo ne s'affiche pas en premier plan...

    Je passe bien dans mon onCreateDialog.

    Je pense que j'ai un problème de conception ou de réalisation de cette partie de l'application qui fait que ça devient tout de suite très complexe.

    J'ai une application qui possède un ViewPager avec trois Fragment. Dans le dernier Fragment qui est un Planificateur j'ai une liste de profiles planifier et que l'on peut Editer - Supprimer. Lorsque je clique sur Editer j'ai un AlertDialog avec une vue custom qui s'affiche. Si je clique sur un bouton de mon AlertDialog actuellement je passe par mon Activity qui elle rappel une méthode static dans mon Fragment et là j'appel mon DialogFragment.

    Dans les vues qui se superpose, j'ai en background mon ViewPager ensuite j'ai le Fragment sur lequel le TabHost est sélectionné puis mon AlertDialog et pour finir je souhaite affiché encore par dessus un DialogFragment.

    Suis-je dans le bon raisonnement ou auriez-vous une suggestion à me faire pour facilité ceux-ci.

    Je souhaite passé par des DialogFragments car les showDialogs sont déprécié maintenant.

    Pour illustré mes propos voici quelque screen de celle-ci.

    Ma listView
    http://hpics.li/237da73

    Lorsque je clique sur Editer
    http://hpics.li/23ea564

    Vue de lorsque j'instancie mon DialogFragment
    http://hpics.li/f3be8b8

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    Pourquoi as-tu une méthode static ? A quoi sert-elle ? N'est-il pas possible de la rendre non statique ?

  9. #9
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 129
    Points : 144
    Points
    144
    Par défaut
    J'ai modifié mes méthodes et maintenant elles ne sont plus statique. Pour faire leurs appels je procède de cette manière.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    FragmentPlanificateur mFragmentPlanificateur = new FragmentPlanificateur();
    mFragmentPlanificateur.editProfile();
    Es-ce la bonne méthode ? Y'a-t-il des choses à faire attention ? Mon Fragment étant déjà instancié je ne savais pas qu'on pouvais travailler de tels sorte.

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    Pour retrouver ton Fragment tu peux soit utiliser le FragmentManager et utiliser findFragmentBy*** ou alors tu peux garder une référence à ton fragment au sein de l'Activity. Tu n'as que 3 Fragments dans ton ViewPager cela ne devrait donc pas donner de problème au niveau de l'allocation mémoire.

  11. #11
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 129
    Points : 144
    Points
    144
    Par défaut
    Maintenant, je récupère la bonne instance du fragment.

    Merci de ton conseil.

    Pour mon problème avec mon DialogFragment qui ne se met pas en premier plan tu aurait une astuce ?

    Je trouve ça lourd de faire appel depuis le Fragment à mon DialogFragment retourné dans mon Activity puis retourné dans mon Fragment pour faire mon traitement.

    Si j'arriverai à avoir le callBack dans mon le fragment ça faciliterai la chose.

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    Certes. Mais les Fragments doivent être conçus pour être indépendants.

    Pour ton problème de DialogFragment invisible, as-tu essayé de voir s'il est vraiment créé, si la méthode onCreate est appellée, onCreateDialog aussi ?

Discussions similaires

  1. Fragment & vertex program
    Par charly dans le forum OpenGL
    Réponses: 5
    Dernier message: 19/03/2004, 19h47
  2. Fonction callback dans une classe
    Par julian_ross dans le forum MFC
    Réponses: 8
    Dernier message: 02/03/2004, 11h42
  3. [MFC] Un callback dans des MFC ...
    Par elsargento dans le forum MFC
    Réponses: 3
    Dernier message: 18/02/2004, 16h04
  4. fragment program sur geForce4 Ti4200
    Par sebh dans le forum OpenGL
    Réponses: 6
    Dernier message: 03/12/2003, 22h31
  5. Fragmentation du DD
    Par guillaume_pfr dans le forum Administration système
    Réponses: 5
    Dernier message: 05/06/2003, 17h19

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