Android MapFragment“;NullPointerException“;启动应用程序时出错

Android MapFragment“;NullPointerException“;启动应用程序时出错,android,android-fragments,Android,Android Fragments,正在开发一个小应用程序,我正在尝试使用其中的片段。该应用程序从URI中提取一些JSON数据。然后,它创建并在列表中显示该数据。如果不涉及片段,所有这些都可以正常工作 我试图让谷歌地图显示在我的布局列表下面的一个片段中,这就是我遇到麻烦的地方 我的API密钥很好。我已经查看了StackTrace,但不知道到底发生了什么。所以,我想请你们帮忙。另外,在建议之前,我已经在Android Studio中多次清理和重建了应用程序 这是我的代码,我将尝试只显示相关的位。如果你需要更多,请告诉我 代码 Mai

正在开发一个小应用程序,我正在尝试使用其中的片段。该应用程序从URI中提取一些JSON数据。然后,它创建并在列表中显示该数据。如果不涉及片段,所有这些都可以正常工作

我试图让谷歌地图显示在我的布局列表下面的一个片段中,这就是我遇到麻烦的地方

我的API密钥很好。我已经查看了StackTrace,但不知道到底发生了什么。所以,我想请你们帮忙。另外,在建议之前,我已经在Android Studio中多次清理和重建了应用程序

这是我的代码,我将尝试只显示相关的位。如果你需要更多,请告诉我

代码

MainActivity.java

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<List<CycloneData>> {
}

CycloneMap.java(我试图添加的片段)

}

XML

cyclone_list.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">


<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <!-- Layout for a list of cyclones -->
    <ListView
        android:id="@+id/cyclone_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="@null"
        android:dividerHeight="0dp"
        android:orientation="vertical"
        android:layout_weight="1"/>

    <!-- Layout for Google Maps Fragment -->
    <FrameLayout
        android:id="@+id/google_map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"/>
</LinearLayout>

...

</RelativeLayout>
堆栈跟踪的原因

原因:java.lang.NullPointerException:尝试对空对象引用调用接口方法'void com.google.maps.api.android.lib6.impl.bq.v()'

我已经浏览了StackTrace并阅读了关于NullPointerExceptions的建议文章。没有帮助。我无法找到或弄清楚空指针指的是什么或如何更正它

编辑/更新


我可能遇到了一个谷歌API错误。如果我在模拟器上运行它,它不会像以前那样崩溃。我发现了错误报告和一些StackOverFlow帖子,它们说问题是由于我的手机的USB连接造成的,或者如果没有SD卡,问题会发生在某些手机上。我的手机(Nexus 5X)上没有SD卡,也没有其他手机可供测试:(

我建议设置您的片段事务,以便您持有的是管理器实例,而不是事务

// Get an instance of your custom map fragment class
// or of "new SupportMapFragment();"
SupportMapFragment mapFragment = new MyMapFragment();

FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
    // Add the Map Fragment to your FrameLayout container
    .replace(R.id.fragment_container, mapFragment, "MAP_FRAGMENT")
    .commit();

您可能想尝试将您的
initGoogleMap()
放在地图片段的
onResume()

中,我建议您设置片段事务,以便您持有的是管理器实例而不是事务

// Get an instance of your custom map fragment class
// or of "new SupportMapFragment();"
SupportMapFragment mapFragment = new MyMapFragment();

FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
    // Add the Map Fragment to your FrameLayout container
    .replace(R.id.fragment_container, mapFragment, "MAP_FRAGMENT")
    .commit();


您可能想尝试将
initGoogleMap()
放在地图片段的
onResume()中

由于stacktrace没有引用您创建的任何类和方法,因此很难调试可能的重复项。这都是Android API和Google Maps API。是的。我同意。我被难住了。Android调试器会允许您进入Google Maps API代码吗?当然,您必须找出如何打破它所以你可以这样做…嗯…是的,它会的,我也经历过。在getMapAsync(新的OnMapReadyCallback()之后不久就死了,而它正在经历FragmentManager.java API代码。我正在经历,但是哇…有很多事情发生了。:)由于stacktrace没有引用您创建的任何类和方法,因此很难调试可能的重复项。它都是Android API和Google Maps API。是的。我同意。我被难住了。Android调试器会允许您进入Google Maps API代码吗?当然,您必须找出如何打破它,以便您可以这样做……嗯……是的,它会的,我也经历过。在getMapAsync(新的OnMapReadyCallback()之后不久就死了,而它正在经历FragmentManager.java API代码。我正在经历,但是哇……发生了很多事情。:)我给了你的建议一次机会,但还是同一个NullPointerException错误。我认为我的问题在于我编写CycloneMap.Java片段的方式。我对OOP相当陌生。来自网络/Unix过程背景,OOP有时会让我感到困惑。我想我可以将所有内容移到MainActivity.Java中,然后用XML静态地完成片段(@CBMidkiff使用
new SupportMapFragment()
应该允许您以编程方式添加它。这种方式对您也不起作用?我没有尝试过,因为我不太确定您打算如何使用它?我也不确定您从何处得到字符串“MAP\u FRAGMENT”.I sorta Butter它我猜编辑此评论。我按照您建议的方式重试了它。它确实加载了映射,但没有从CycloneMap.java片段加载。它加载了一个基本映射。与“修复”相同我想我昨天就想到了。我似乎无法让CycloneMap.java片段代码正确运行和加载。调用该代码时,它只会生成NullException。我仔细阅读了文档,它说明必须在主线程中运行“getMapAsync”。因此,我将所有内容移到MainActivity.java中,它正在工作正如我所希望的。我确信我在我的片段中做了一些错误的事情……不知道……稍后我会回到这一点。我已经在这上面敲了三天左右了。:P想做点别的事。:)我给了你的建议一次机会,但还是同一个NullPointerException错误。我认为我的问题在于我编写CycloneMap.Java片段的方式。我对OOP相当陌生。来自网络/Unix过程背景,OOP有时会让我感到困惑。我想我可以将所有内容移到MainActivity.Java中,然后用XML静态地完成片段(@CBMidkiff使用
new SupportMapFragment()
应该允许您以编程方式添加它。这种方式对您也不起作用?我没有尝试过,因为我不太确定您打算如何使用它?我也不确定您从何处得到字符串“MAP\u FRAGMENT”.I sorta Butter它我猜编辑此评论。我按照您建议的方式重试了它。它确实加载了映射,但没有从CycloneMap.java片段加载。它加载了一个基本映射。与“修复”相同我想我昨天就想到了。我似乎无法让CycloneMap.java片段代码正确运行和加载。调用该代码时,它只会生成NullException。我仔细阅读了文档,它指出必须在中运行“getMapAsync”
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.palarran.cycloops">

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true" />

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission     android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher_cycloops"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>

            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

    <activity
        android:name=".MenuSettingsActivity"
        android:label="@string/settings_title">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.palarran.cycloops.MenuSettingsActivity"/>
    </activity>

    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="AHlaSyCIse5CB1QqYj9IqKzd7jRwGtIdjI48Mto"/>

    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version"/>
</application>

</manifest>
E/AndroidRuntime: FATAL EXCEPTION: main
                                                                   Process: com.palarran.cycloops, PID: 31964
                                                                   java.lang.RuntimeException: Unable to start activity ComponentInfo{com.palarran.cycloops/com.palarran.cycloops.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'void com.google.maps.api.android.lib6.impl.bq.v()' on a null object reference
                                                                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)
                                                                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
                                                                       at android.app.ActivityThread.-wrap12(ActivityThread.java)
                                                                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
                                                                       at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                       at android.os.Looper.loop(Looper.java:154)
                                                                       at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
                                                                    Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'void com.google.maps.api.android.lib6.impl.bq.v()' on a null object reference
                                                                       at com.google.maps.api.android.lib6.impl.co.i(:com.google.android.gms.DynamiteModulesB:178)
                                                                       at com.google.android.gms.maps.internal.w.onTransact(:com.google.android.gms.DynamiteModulesB:209)
                                                                       at android.os.Binder.transact(Binder.java:499)
                                                                       at com.google.android.gms.maps.internal.IMapFragmentDelegate$zza$zza.onStart(Unknown Source)
                                                                       at com.google.android.gms.maps.SupportMapFragment$zza.onStart(Unknown Source)
                                                                       at com.google.android.gms.dynamic.zza$6.zzb(Unknown Source)
                                                                       at com.google.android.gms.dynamic.zza.zza(Unknown Source)
                                                                       at com.google.android.gms.dynamic.zza.onStart(Unknown Source)
                                                                       at com.google.android.gms.maps.SupportMapFragment.onStart(Unknown Source)
                                                                       at android.support.v4.app.Fragment.performStart(Fragment.java:2215)
                                                                       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1340)
                                                                       at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528)
                                                                       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595)
                                                                       at android.support.v4.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:2893)
                                                                       at android.support.v4.app.FragmentController.dispatchStart(FragmentController.java:212)
                                                                       at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:613)
                                                                       at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:178)
                                                                       at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1248)
                                                                       at android.app.Activity.performStart(Activity.java:6696)
                                                                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2628)
                                                                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
                                                                       at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                                                                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
                                                                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                       at android.os.Looper.loop(Looper.java:154) 
                                                                       at android.app.ActivityThread.main(ActivityThread.java:6119) 
                                                                       at java.lang.reflect.Method.invoke(Native Method) 
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
// Get an instance of your custom map fragment class
// or of "new SupportMapFragment();"
SupportMapFragment mapFragment = new MyMapFragment();

FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
    // Add the Map Fragment to your FrameLayout container
    .replace(R.id.fragment_container, mapFragment, "MAP_FRAGMENT")
    .commit();