2017-03-21 2 views
1

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

Verursacht durch: java.lang.NullPointerException: Versuch Schnittstellenmethode 'VOID com.google.maps.api.android.lib6.impl.bq.v()' auf null Objektreferenz

aufzurufen

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. :(

+0

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

+0

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. –

+0

Ja. Ich würde zustimmen. Ich bin ratlos. –

Antwort

0

Ich würde empfehlen, Ihre Fragment Transaktion einrichten, so dass Sie eine Instanz des Managers anstelle der Transaktion der Hand halten.

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

Und Sie können Putten versuchen möchten Ihre initGoogleMap() in Ihrem Map Fragment des onResume()

+0

Ich gab Ihrem Vorschlag eine Chance, aber die gleiche NullPointerException Fehler. Ich denke, mein Problem ist, wie ich das CycloneMap.Java Fragment geschrieben habe. Ich bin ziemlich neu in OOP. Ausgehend von einem prozeduralen Netzwerk-/Unix-Hintergrund verwechselt OOP mich manchmal. Ich denke, ich könnte alles in MainActivity.java verschieben und das Fragment einfach statisch in XML machen. :( –

+0

@CBMidkiff mit 'new SupportMapFragment()' sollte es Ihnen erlauben, es programmgesteuert hinzuzufügen. Auf diese Weise funktionierte auch nicht für Sie? –

+0

Ich habe es nicht versucht, weil ich nicht genau wusste, wie Sie das gemeint haben Ich war mir auch nicht sicher, wo Sie die Zeichenfolge "MAP_FRAGMENT" gefunden haben. Ich habe sie abgeschlachtet. Ich glaube, –

Verwandte Themen