Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java NullPointerException在带有嵌套google地图片段的回按片段上_Java_Android_Google Maps_Android Fragments_Nullpointerexception - Fatal编程技术网

Java NullPointerException在带有嵌套google地图片段的回按片段上

Java NullPointerException在带有嵌套google地图片段的回按片段上,java,android,google-maps,android-fragments,nullpointerexception,Java,Android,Google Maps,Android Fragments,Nullpointerexception,我有一个活动,它使用几个片段显示内容。其中一个片段需要在其中显示一个谷歌地图片段。我已经用下面的代码正确显示了地图片段,并且应用程序在不同片段之间转换时运行良好,但是,每次我通过按地图片段的后退按钮退出应用程序时,我都会收到一条android错误警报消息和以下logcat中的nullpointerexception错误。日志响应不会指向代码中可以处理异常的任何地方。我认为问题在于ondestroyView()方法,但我目前对片段了解不够,无法修复它。有什么想法吗 Logcat错误: 01-10

我有一个活动,它使用几个片段显示内容。其中一个片段需要在其中显示一个谷歌地图片段。我已经用下面的代码正确显示了地图片段,并且应用程序在不同片段之间转换时运行良好,但是,每次我通过按地图片段的后退按钮退出应用程序时,我都会收到一条android错误警报消息和以下logcat中的nullpointerexception错误。日志响应不会指向代码中可以处理异常的任何地方。我认为问题在于ondestroyView()方法,但我目前对片段了解不够,无法修复它。有什么想法吗

Logcat错误:

01-10 14:15:42.888: E/AndroidRuntime(15039): FATAL EXCEPTION: main
01-10 14:15:42.888: E/AndroidRuntime(15039): java.lang.NullPointerException
01-10 14:15:42.888: E/AndroidRuntime(15039):    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1410)
01-10 14:15:42.888: E/AndroidRuntime(15039):    at android.app.FragmentManagerImpl$1.run(FragmentManager.java:441)
01-10 14:15:42.888: E/AndroidRuntime(15039):    at android.os.Handler.handleCallback(Handler.java:725)
01-10 14:15:42.888: E/AndroidRuntime(15039):    at android.os.Handler.dispatchMessage(Handler.java:92)
01-10 14:15:42.888: E/AndroidRuntime(15039):    at android.os.Looper.loop(Looper.java:137)
01-10 14:15:42.888: E/AndroidRuntime(15039):    at android.app.ActivityThread.main(ActivityThread.java:5041)
01-10 14:15:42.888: E/AndroidRuntime(15039):    at java.lang.reflect.Method.invokeNative(Native Method)
01-10 14:15:42.888: E/AndroidRuntime(15039):    at java.lang.reflect.Method.invoke(Method.java:511)
01-10 14:15:42.888: E/AndroidRuntime(15039):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-10 14:15:42.888: E/AndroidRuntime(15039):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-10 14:15:42.888: E/AndroidRuntime(15039):    at dalvik.system.NativeStart.main(Native Method)
以下是发生错误的片段:

public class HomeFragment extends Fragment {


public HomeFragment(){}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_home, container, false);

    return rootView;
}  


public void onDestroyView() {

    Fragment fragment = (getFragmentManager().findFragmentById(R.id.mainmap));  
    FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
    ft.remove(fragment);
    ft.commit();

    super.onDestroyView();
}   
片段的xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/bg">

    <fragment 
    android:id="@+id/mainmap"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:name="com.google.android.gms.maps.MapFragment"/> 
</RelativeLayout>

试试这个。在类中添加FragmentManager作为静态字段

    private static FragmentManager mFragmentManagerSupport; 

    @Override
    public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          mFragmentManagerSupport = this.getSupportFragmentManager();

          ....

      }
当您第一次调用fragment时,您需要像这样调用“add”或“replace”方法

    mFragmentManagerSupport.beginTransaction()
        .replace(R.id.content_frame, mContent)
        .commit();

如果没有此选项,fragmentmanager将有0个片段。

如果UI元素在XML文件中声明,则无法删除它。如果您希望某些元素是可移动的,那么必须从代码中添加它们,而不是在XML中添加它们。另外,在您的
onDestroyView中删除它也没有意义,您首先没有添加它。

您只需初始化FragmentManager并将Fragment作为全局变量
public class MainActivity extends Activity  { 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ...

    }


    // Display fragment view 
    private void displayView(int position) {

        Fragment fragment = null;

        switch (position) {
        case 0:         
            fragment = new HomeFragment();
            break;
        case 1:
            fragment = new PromotionsFragment();
            break;
        case 2:
            fragment = new ProfileFragment();
            break;
        case 3:
            fragment = new SettingsFragment();
            break; 
        default:
            break;
        }


        if (fragment != null) {

            FragmentManager fragmentManager = getFragmentManager();

            fragmentManager.beginTransaction()
                    .replace(R.id.frame_container, fragment).commit();

        } else {
            // error in creating fragment
            Log.e("MainActivity", "Fragment creation error");
        }
    }
这就是我所做的,为我工作:

private static FragmentManager fragmentManager;
private Fragment fragment = null;

经过长时间的研究,我也遇到了同样的问题,我找到了以下答案:-

@Override
public void onDestroyView()
{
    super.onDestroyView();
    SupportMapFragment f = (SupportMapFragment) getFragmentManager().findFragmentById(R.id.map);
    if (!getActivity().isFinishing())
    {
        if (f != null)
        {
            getFragmentManager().beginTransaction().remove(f).commit();
        }
    }
}

然后问题出现了,如果你想退出应用程序,为什么要删除片段如果活动将被销毁我在片段之间转换时发现,如果我没有在销毁时删除映射片段,我会得到一个膨胀异常。我也有同样的问题。你有什么解决方案吗?嗨,谢谢,不过我还没修好。我在MainActivity中初始化片段的代码已经是这样了。唯一的区别是我的代码没有使用静态碎片管理器。我添加了静态字段以查看它是否有效,但没有任何更改。只是更新了我的问题,以包括我的MainActivity类的相关部分。