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 :

Contextual action mode dans un fragment


Sujet :

Android

  1. #1
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut Contextual action mode dans un fragment
    Bonjour,

    Je rencontre un soucis avec un menu contextuel qui apparait à l'emplacement d'une actionBar.

    Mon appli : une activité affichant le fragment A ou le fragment B. Quand le fragment A est affiché, j'affiche une ActionBar, et quand le fragment B est affiché, il n'y a plus d'ActionBar mais un menu contextuel construit avec ActionMode.

    Au début de mes recherches, j'ai codé le "contextual action mode" dans mon Activité, au même titre que l'ActionBar.

    Mon problème, c'est lorsqu'un clique dans le menu contextuel doit appeler une méthode du fragment B : rien ne se passe. Et pour cause, j'ai recherché mon fragment vient le fragment manager (avec findFragmentByTag) et le résultat est "null", alors qu'il est bien affiché. Déjà ce point me laisse perplexe.

    Je fais quelques recherches sur le net, et là je ne trouve que des exemples codé dans la classe Fragment, et non dans la classe "Activity", ce qui semble logique : l'activité pilote le fragment, mais le fragment propose son propre menu contextuel. Donc je veux tester ça.

    A l'execution, j'ai un méchant plantage que je ne comprend pas.

    Voici le code de ce menu contextuel :
    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
        /*
         * Gestion de ActionMode pour l'édition --------------------------------------------------------
         */
        private void startActionMode () {
            if (mActionMode == null) {
                // start the CAB using the ActionMode.Callback defined above
                mActionMode = ((ActionBarActivity) getActivity()).startSupportActionMode(mActionModeCallback);
            }
        }
     
        private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {
     
            // Called when the action mode is created; startActionMode() was called
            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                // inflate a menu resource providing context menu items
                MenuInflater inflater = mode.getMenuInflater();
                // assumes that you have "contexual.xml" menu resources
                inflater.inflate(R.menu.contextual_1, menu);
                return true;
            }
     
            // called each time the action mode is shown. Always called after
            // onCreateActionMode, but
            // may be called multiple times if the mode is invalidated.
            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                return false; // Return false if nothing is done
            }
     
            // called when the user selects a contextual menu item
            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.action_1:
                        mActionMode.finish(); // Action picked, so close the CAB
                        return true;
     
                    default:
                        return false;
                }
            }
     
            // called when the user exits the action mode
            public void onDestroyActionMode(ActionMode mode) {
                mActionMode = null;
            }
        };
        // ---------------------------------------------------------------------------------------------
    Lors de l'affichage de mon fragment B, j'appelle la méthode startActionMode pour l'activer.

    Mon appli fonctionne bien sans ce code. D'ailleurs ce code ne sert qu'à afficher cette barre d'icone un peu spéciale, elle n'a que 2 boutons pour l'instant, et un de ces boutons provoque juste la fermeture de l'action mode.

    Voici la log qui confirme juste que c'est la création du menu contextuel qui se passe mal :
    05-14 05:21:01.130 1213-1213/com.sample.test1E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.sample.test1, PID: 1213
    java.lang.NullPointerException
    at com.sample.test1.MonFragment.startActionMode(MonFragment.java:220)
    at com.sample.test1.MonActivity.showCounterEditFragment(MonActivity.java:265)
    at com.sample.test1.MonActivity.onOptionsItemSelected(MonActivity.java:100)
    at android.app.Activity.onMenuItemSelected(Activity.java:2600)
    at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:372)
    at android.support.v7.app.ActionBarActivity.superOnMenuItemSelected(ActionBarActivity.java:244)
    at android.support.v7.app.ActionBarActivityDelegateICS.onMenuItemSelected(ActionBarActivityDelegateICS.java:164)
    at android.support.v7.app.ActionBarActivity.onMenuItemSelected(ActionBarActivity.java:130)
    at android.support.v7.app.ActionBarActivityDelegateICS$WindowCallbackWrapper.onMenuItemSelected(ActionBarActivityDelegateICS.java:308)
    at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:1012)
    at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735)
    at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
    at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
    at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:546)
    at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:115)
    at android.view.View.performClick(View.java:4438)
    at android.view.View$PerformClick.run(View.java:18422)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5017)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
    at dalvik.system.NativeStart.main(Native Method)
    Je précise que j'essaie de n'utiliser que les librairies "support".

  2. #2
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut
    J'ai fini par trouver : la méthode startActionMode devait être appelé dans le "OncCreateView" de mon Fragment.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. interaction keyevent et action bar dans un fragment
    Par aristide13 dans le forum Android
    Réponses: 7
    Dernier message: 15/03/2014, 09h59
  2. [WebForms][1.1] Conflit entre mode dans un DataGrid
    Par estrasse dans le forum Général Dotnet
    Réponses: 5
    Dernier message: 26/12/2005, 14h53
  3. Logs SQL des actions réalisées dans Enterprise Manager ?
    Par [DreaMs] dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/08/2005, 12h14
  4. [Virtual Pascal] [OWL] Actions clavier dans un dialogue non modal
    Par Alcatîz dans le forum Autres IDE
    Réponses: 3
    Dernier message: 28/07/2005, 11h04
  5. Réponses: 2
    Dernier message: 03/02/2005, 08h59

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