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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    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
    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 émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    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 éprouvé
    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
    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 émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    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 éprouvé
    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
    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 émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    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)

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