Android 试图从视图中删除片段会在mNextAnim上产生NullPointerException
我有3个片段,一个NavigationDrawer,一个MapFragment和一个用户定义的“MapInfo片段”。我希望“MapInfo片段”在某些事件中在MapFragment的上方显示为半透明,在其他事件中消失。我真的不在乎是否每次都完全删除片段并创建一个新片段,或者只是更改显示的可见性和信息。目前我只是尝试使用FragmentManager的.hide()函数,但我也尝试了.remove和.detach,结果类似 错误:Android 试图从视图中删除片段会在mNextAnim上产生NullPointerException,android,android-fragments,android-studio,Android,Android Fragments,Android Studio,我有3个片段,一个NavigationDrawer,一个MapFragment和一个用户定义的“MapInfo片段”。我希望“MapInfo片段”在某些事件中在MapFragment的上方显示为半透明,在其他事件中消失。我真的不在乎是否每次都完全删除片段并创建一个新片段,或者只是更改显示的可见性和信息。目前我只是尝试使用FragmentManager的.hide()函数,但我也尝试了.remove和.detach,结果类似 错误: 03-18 14:28:10.965 24711-24711/
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>
更新1
我将map\u info\u布局
更改为map\u info
,我得到的错误没有变化。我以前将map\u info\u layout
定义为MapInfo片段的布局xml的根FrameLayout的id,因此我认为map\u info\u layout
和map\u info
指向同一个对象
更新2:我的解决方案
原来我使用了MapInfoFragment
扩展android.support.v4.app.Fragment
而不是android.app.FragmentTransaction
,我使用的是android.app.FragmentTransaction
而不是android.support.v4.app.FragmentTransaction
。将所有内容切换到android.app。,因为我对旧设备的兼容性不感兴趣。谢谢你,弗洛
更新3:一般解决办法
不要试图隐藏空对象我知道你自己已经解决了这个问题,但我想解释一下这个错误是如何发生的,因为它刚刚发生在我身上 基本上,您使用空值调用
hide()
,remove()
,等等
错误并不明显,而且发生这种情况时堆栈跟踪并非来自您自己的源,因此了解它是什么并不容易。这是因为您现在添加、显示或隐藏了一个空片段,请在使用它之前尝试检查它是否为空 当调用
FragmentManager.popBackstack()
而backstack中没有片段时,也会发生这种情况。只有当我使用导航抽屉中的一个片段显示DialogFragment时,才会发生这种情况
newFragment.show(getFragmentManager(), "dialog");
如果我用
newFragment.show(getChildFragmentManager(), "dialog");
这并没有发生
注意:在显示或关闭对话框时,我没有发生崩溃,但在从导航抽屉切换到另一个片段时发生了崩溃。我的问题是FragmentManager的getFragments()有时返回一个列表,其中一些片段为空,而我正在删除这些空片段。正确地调用show()和hide()
private void showFragment(int fragmentIndex,boolean addToBackStack){
FragmentManager fm=getFragmentManager();
FragmentTransaction=fm.beginTransaction();
for(int i=0;i
如果需要使用getSupportFragmentManager(),除了执行空检查外,还必须检查当前是否添加了该片段。如果只使用null,它仍然会崩溃。这将有助于:
if (fragment != null && fragment.isAdded()) {
getSupportFragmentManager().beginTransaction().
remove(getSupportFragmentManager().findFragmentById(R.id.fragment_container)).commit();
}
也许我错了,但我没有看到名为
map\u info\u layout
的片段,在您的布局中,我只看到map\u info
+1来指出这一点<代码>尝试写入空对象引用上的字段“int*.mNextAnim”在尝试显示()或隐藏()传递空片段时引发。F.这应该是正确的答案,在这个问题上浪费了太多时间,直到我发现:“基本上,你调用的是hide()、remove(),等等,都是空值。”ThanksI不得不使用getFragmentManager().findframentById(R.id.faultyFragment)
而不是getFragmentManager().findframentById(mReferenceToFaultyFragment.getId())
。我在onCreateView()
中获得了引用,在我替换任何片段之前,它就发生在我身上了。它发生在FragmentTransaction事务=getActivity().getSupportFragmentManager().beginTransaction()中代码>你是如何解决的?我尝试了GetBackbackEntryCount(),但它不起作用。我通过在Backback中没有碎片的情况下不执行PopBackback来修复它。您到底是如何检查Backbackback中的碎片的?我试过fragmentManager.findFragmentById(容器ID)!=null,它也不起作用。不知道还要检查什么。我不在后台检查。我只是写了我的代码,这样,如果backbackback中没有片段,它就不会弹出backbackback。一般来说,我认为如果你不知道backbackback中包含了什么,那么弹出backbackback是个坏主意。使用popbackackimmediate()
instead似乎是我的情况,但我从ChildFragmentManager中获取了片段。谢谢
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();
}
if (fragment != null && fragment.isAdded()) {
getSupportFragmentManager().beginTransaction().
remove(getSupportFragmentManager().findFragmentById(R.id.fragment_container)).commit();
}