Android 试图从视图中删除片段会在mNextAnim上产生NullPointerException

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/

我有3个片段,一个NavigationDrawer,一个MapFragment和一个用户定义的“MapInfo片段”。我希望“MapInfo片段”在某些事件中在MapFragment的上方显示为半透明,在其他事件中消失。我真的不在乎是否每次都完全删除片段并创建一个新片段,或者只是更改显示的可见性和信息。目前我只是尝试使用FragmentManager的.hide()函数,但我也尝试了.remove和.detach,结果类似

错误:

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();
                }