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 :
Lors de l'affichage de mon fragment B, j'appelle la méthode startActionMode pour l'activer.
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; } }; // ---------------------------------------------------------------------------------------------
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 :
Je précise que j'essaie de n'utiliser que les librairies "support".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)
Partager