Ich arbeite an einer kleinen App, in der ich versuche, Fragmente zu verwenden. Die App ruft einige JSON-Daten von einem URI ab. Er erstellt dann diese Daten in einer Liste. All das funktioniert gut, wenn das Fragment nicht beteiligt ist.Android MapFragment "NullPointerException" Fehler beim Starten der App
Ich versuche, Google Maps in einem Fragment unterhalb dieser Liste in meinem Layout anzuzeigen, und das ist, wo ich in Schwierigkeiten gerate.
Mein API-Schlüssel ist gut. Ich bin durch den StackTrace gegangen, kann aber nicht herausfinden, was gerade passiert. Also bitte ich euch um Hilfe. Außerdem, bevor es vorgeschlagen wird, habe ich die App in Android Studio viele Male gereinigt und neu erstellt.
Hier ist mein Code, den ich versuche, nur die relevanten Bits zu zeigen. Lass es mich wissen, wenn du mehr brauchst.
CODE
MainActivity.java
public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<List<CycloneData>> {
...
privaten CycloneMap cycloneMapFrag;
private void initMapFragment() {
android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
cycloneMapFrag = new CycloneMap();
SupportMapFragment supportMapFragment = cycloneMapFrag;
fragmentTransaction.add(google_map, supportMapFragment);
fragmentTransaction.commit();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.cyclone_list);
...
initMapFragment();
}
}
CycloneMap.java (Das Fragment im Versuch, hinzufügen)
public class CycloneMap extends SupportMapFragment {
//Defining Google Map objects variables
private GoogleMap googleMapView;
boolean mapReady = false;
static final CameraPosition START_POINT = CameraPosition.builder()
.target(new LatLng(38.1254, -101.1703))
.zoom(3)
.bearing(359)
.tilt(5)
.build();
private void initGoogleMap() {
getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
//Setting mapReady to true
mapReady = true;
//Loading local instance map from Callback
googleMapView = googleMap;
//Set map type to Satellite view
googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
//Set camera at starting point, high over the middle of the U.S of A.
initialCameraPosition(START_POINT);
}
});
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.cyclone_list, container, false);
}
//@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initGoogleMap();
}
private void initialCameraPosition(CameraPosition target) {
//Setting position to the target created above
googleMapView.moveCamera(CameraUpdateFactory.newCameraPosition(target));
}
}
XML
cyclone_list.xml Layout-Datei
<?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>
MANIFESTEN
<?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>
STACKTRACE
CATLOG sagt:
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)
Ursache von Stacktrace
aufzurufenVerursacht durch: java.lang.NullPointerException: Versuch Schnittstellenmethode 'VOID com.google.maps.api.android.lib6.impl.bq.v()' auf null Objektreferenz
Ich habe den StackTrace durchgelesen und den vorgeschlagenen Artikel zu NullPointerExceptions gelesen. Keine Hilfe dort. Ich kann weder herausfinden noch herausfinden, worauf sich der NullPointer bezieht oder wie er korrigiert werden kann.
EDIT/UPDATE
könnte ich in einen Google-API Fehler ausgeführt werden. Wenn ich das auf einem Emulator ausführe, stürzt es nicht wie vorher ab.Ich habe Fehlerberichte und einige StackOverFlow-Posts gefunden, die sagen, dass das Problem aufgrund der USB-Verbindung zu meinem Telefon auftritt oder dass es bei einigen Telefonen passiert, wenn keine SD-Karte vorhanden ist. Ich habe keine SD-Karte auf meinem Telefon (Nexus 5X) und kein anderes Telefon zum Testen. :(
Mögliche Duplikate von [Was ist eine NullPointerException, und wie behebe ich es?] (Http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i -fix-it) – Ironman
Dies ist sehr schwierig zu debuggen, da der Stacktrace keinen Bezug zu irgendeiner Klasse und Methode hat, die Sie erstellt haben ndroid API und Google Maps API. –
Ja. Ich würde zustimmen. Ich bin ratlos. –