J'ai 3 fragments, un NavigationDrawer, un MapFragment et un "MapInfoFragment" défini par l'utilisateur. Je souhaite que "MapInfoFragment" apparaisse semi-transparent par dessus le MapFragment lors de certains événements et disparaisse pour d'autres. Je ne me soucie pas vraiment de supprimer complètement le fragment et d'en créer un nouveau à chaque fois, ou de changer simplement la visibilité et les informations affichées. Actuellement, j'essaie simplement d'utiliser la fonction .hide () de FragmentManager, mais j'ai également essayé .remove et .detach avec des résultats similaires.
Erreur:
03-18 14:28:10.965 24711-24711/com.[packageName].asTest D/AndroidRuntime﹕ Shutting down VM
03-18 14:28:10.965 24711-24711/com.[packageName].asTest E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.[packageName].asTest, PID: 24711
Java.lang.NullPointerException: Attempt to write to field 'int Android.app.Fragment.mNextAnim' on a null object reference
at Android.app.BackStackRecord.run(BackStackRecord.Java:658)
at Android.app.FragmentManagerImpl.execPendingActions(FragmentManager.Java:1447)
at Android.app.FragmentManagerImpl$1.run(FragmentManager.Java:443)
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.invoke(Native Method)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:779)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:595)
Activity_main.xml:
<Android.support.v4.widget.DrawerLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/drawer_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
tools:context="com.[packageName].asTest.MainActivity">
<!-- As the main content view, the view below consumes the entire
space available using match_parent in both dimensions. -->
<FrameLayout
Android:id="@+id/container"
Android:layout_width="match_parent"
Android:layout_height="match_parent" >
<fragment xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:map="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/map"
Android:name="com.google.Android.gms.maps.MapFragment"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
map:cameraZoom="8"
map:mapType="satellite"
map:uiRotateGestures="false"
Android:layout_gravity="center_horizontal|top"
/>
</FrameLayout>
<fragment Android:id="@+id/navigation_drawer"
Android:layout_width="@dimen/navigation_drawer_width"
Android:layout_height="match_parent"
Android:layout_gravity="start"
Android:name="com.[packageName].asTest.NavigationDrawerFragment"
tools:layout="@layout/simple_list_item_1" />
<fragment Android:id="@+id/map_info"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:name="com.[packageName].asTest.MapInfoFragment" />
</Android.support.v4.widget.DrawerLayout>
Code fautif:
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.hide(getFragmentManager().findFragmentById(R.id.map_info));
ft.commit();
J'ai changé map_info_layout
en map_info
et l'erreur que je reçois ne change pas. J'avais précédemment défini map_info_layout
en tant qu'id pour la racine FrameLayout de la mise en forme xml de MapInfoFragment. Je pense donc que map_info_layout
et map_info
pointaient vers la même chose.
Il s'est avéré que j'avais MapInfoFragment
étendant Android.support.v4.app.Fragment
au lieu de Android.app.Fragment
et que j'utilisais le Android.app.FragmentTransaction
au lieu de Android.support.v4.app.FragmentTransaction
. Tout a basculé sur Android.app.
puisque la compatibilité des anciens appareils ne m'intéresse pas. Merci beaucoup.
Arrête d'essayer de cacher des objets nuls
Je sais que vous avez résolu le problème vous-même, mais je tiens à expliquer comment cette erreur se produit, car elle m'est simplement arrivée.
Fondamentalement, vous appelez hide()
, remove()
, etc., avec une valeur null.
L'erreur n'est pas évidente, et la trace de la pile ne provient pas de vos propres sources lorsque cela se produit, il n'est donc pas anodin de comprendre ce que c'est.
Cela se produit également lorsque vous appelez FragmentManager.popBackstack()
sans qu'il y ait un fragment dans le pile.
c'est parce que vous ajoutez, affichez ou masquez un fragment qui est nul maintenant, essayez de vérifier s'il est nul avant de l'utiliser!
Mon problème était que getFragments () de FragmentManager renvoyait parfois une liste où certains fragments étaient nuls et que je supprimais ces fragments nuls.
Appelez show () et hide () correctement ...
private void showFragment(int fragmentIndex, boolean addToBackStack) {
FragmentManager fm = getFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
for (int i = 0; i < fragments.length; i++) {
if (i == fragmentIndex) {
transaction.show(fragments[i]);
} else {
transaction.hide(fragments[i]);
}
}
if (addToBackStack) {
transaction.addToBackStack(null);
}
transaction.commit();
}
Cela m'est arrivé seulement quand, à partir d'un des fragments du tiroir de navigation, j'ai montré un DialogFragment en utilisant
newFragment.show(getFragmentManager(), "dialog");
Si à la place j'ai utilisé
newFragment.show(getChildFragmentManager(), "dialog");
ce n'est pas arrivé.
REMARQUE: le blocage ne m'est pas arrivé lors de l'affichage ou de la fermeture de la boîte de dialogue, mais lors du passage à un autre fragment du tiroir de navigation.