试图从视图中删除片段给我mNextAnim上的NullPointerException

Koe*_*ber 45 android android-fragments android-studio

我有3个片段,一个NavigationDrawer,一个MapFragment和一个用户定义的"MapInfoFragment".我希望"MapInfoFragment"在某些事件上在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)
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

违规守则:

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.hide(getFragmentManager().findFragmentById(R.id.map_info));
ft.commit();
Run Code Online (Sandbox Code Playgroud)

更新1

我改变map_info_layoutmap_info,我得到的错误没有变化.我之前已经map_info_layout定义为MapInfoFragment布局xml的根FrameLayout的id,所以我认为map_info_layoutmap_info指向同样的事情.

更新2:我的解决方案

事实证明我MapInfoFragment延伸android.support.v4.app.Fragment而不是android.app.Fragment和我使用android.app.FragmentTransaction而不是android.support.v4.app.FragmentTransaction.切换所有内容,android.app.因为我对旧设备兼容性不感兴趣.谢谢Fllo.

更新3:一般解决方案

停止尝试隐藏空对象

gak*_*gak 115

我知道你自己已经解决了这个问题,但我想解释一下这个错误是如何发生的,因为它刚好发生在我身上.

基本上你打电话hide(),remove()等,用一个空值.

错误并不明显,当发生这种情况时,堆栈跟踪不会源自您自己的源,因此实现它的目的并非易事.

  • 指出这一点+ 1.`尝试show()或hide()传递空片段时,尝试在空对象引用上写入字段'int*.mNextAnim'.F. (14认同)
  • 我不得不使用`getFragmentManager().findFragmentById(R.id.faultyFragment)`而不是`getFragmentManager().findFragmentById(mReferenceToFaultyFragment.getId())`.我在`onCreateView()`中得到了引用 (2认同)

Chr*_*ine 8

当你FragmentManager.popBackstack()在没有后台堆叠片段的情况下打电话时也会发生这种情况.


how*_*nea 5

这是因为您添加或显示或隐藏现在为null的片段,在使用它之前尝试检查它是否为null!