2017-04-30 1 views
0

Ich fing an, an einer alten Anwendung zu arbeiten, die ich verwende, die ein Kartenfragment auf einer Navigationsschublade verwendet. Früher hat es funktioniert, aber jetzt, mit dem neuen Permisson, bekomme ich ein paar Fehler. Ich habe im Allgemeinen auf SO und im Internet gesucht, aber ich weiß nicht, was ich vermisse. Meine Karte Fragment unterAndroid: Fehler mit Kartenfragment auf Navigationsschublade und Berechtigungsprüfung

public class Fragment_maps extends android.support.v4.app.Fragment implements OnMapLongClickListener, OnMapClickListener, OnMapReadyCallback { 

MapView mMapView; 
GoogleMap googleMap; 

@Override 
public void onMapReady(GoogleMap googleMap) { 

} 

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

    // inflate and return the layout 
    View v = inflater.inflate(R.layout.fragment_maps, container, false); 
    mMapView = (MapView) v.findViewById(R.id.map); 
    mMapView.onCreate(savedInstanceState); 
    //activate menu button 
    setHasOptionsMenu(true); 

    mMapView.onResume();// needed to get the map to display immediately 

    try { 
     MapsInitializer.initialize(getActivity().getApplicationContext()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    //get the map 
    mMapView.getMapAsync(this); 
    // Detect location 
    googleMap.setMyLocationEnabled(true); 
    googleMap.getUiSettings().setMyLocationButtonEnabled(false); 
    //googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
    // Turns traffic layer on 
    googleMap.setTrafficEnabled(true); 
    // Enables indoor maps 
    googleMap.setIndoorEnabled(true); 
    // Enables indoor maps 
    googleMap.setIndoorEnabled(true); 
    // Turns on 3D buildings 
    googleMap.setBuildingsEnabled(true); 
    // Show Zoom buttons 
    googleMap.getUiSettings().setZoomControlsEnabled(true); 
    // latitude and longitude 
    double latitude = 40.639350; 
    double longitude = 22.944607; 

    googleMap.setOnMapLongClickListener(this); 
    googleMap.setOnMapClickListener(this); 


    // create marker 
    MarkerOptions thessaloniki = new MarkerOptions().position(new LatLng(latitude, longitude)).title("Thessaloniki"); 

    // Changing marker icon 
    thessaloniki.icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_ROSE)); 

    // adding marker 
    googleMap.addMarker(thessaloniki); 
    CameraPosition cameraPositionThess = new CameraPosition.Builder() .target(new LatLng(40.639350, 22.944607)).zoom(12).build(); 
    googleMap.animateCamera(CameraUpdateFactory .newCameraPosition(cameraPositionThess)); 

    // Perform any camera updates here 
    return v; 
} 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    inflater.inflate(R.menu.fragment_maps, menu); 
    super.onCreateOptionsMenu(menu, inflater); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    Log.d("onOptionsItemSelected","yes"); 
    switch (item.getItemId()) { 
    case R.id.HYBRID: 
     googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
     return true; 
    case R.id.SATELLITE: 
     googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE); 
     return true; 
    case R.id.TERRAIN: 
     googleMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN); 
     return true; 
    case R.id.NORMAL: 
     googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
     return true; 

    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

@Override 
public void onMapClick(LatLng point) { 
    Toast.makeText(getActivity(),point.toString(),Toast.LENGTH_SHORT).show(); 
    googleMap.animateCamera(CameraUpdateFactory.newLatLng(point)); 
} 

@Override 
public void onMapLongClick(LatLng point) { 
    if (SelectUserActivity.flagOwner){ 
     googleMap.addMarker(new MarkerOptions() 
     .position(point) 
     .title(MainActivity.onomaxarth)   
     .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED))); 
     Toast.makeText(getActivity(),"Hotel pinned at: "+point.toString(),Toast.LENGTH_SHORT).show(); 
    }else{ 
     Toast.makeText(getActivity(),point.toString(),Toast.LENGTH_SHORT).show(); 
    } 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    mMapView.onResume(); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    mMapView.onPause(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    mMapView.onDestroy(); 
} 

@Override 
public void onLowMemory() { 
    super.onLowMemory(); 
    mMapView.onLowMemory(); 
} 

I googleMap = mMapView.getMap(); verwendet, um die Karte zu bekommen, aber ich es ändern müssen mit mMapView.getMapAsync(this); von OnMapReadyCallback implementieren, und es hat mich gezwungen, die onMapReady Methode zu erstellen, die ich weiß nicht, wie es anders ist von der onCreateView Methode, also lasse ich es leer.

Jetzt bekomme ich einen Fehler auf googleMap.setMyLocationEnabled(true); für die Erlaubnis und wenn ich meine App debuggen ist das GoogleMap-Objekt null. Wenn ich es starte, stürzt die App beim Auswählen des Kartenfragments ab und beendet die Aktivität, die die Fragmente enthält.

Auf dem Manifest ich habe

android:minSdkVersion="17" 
android:targetSdkVersion="23" 

und meine gradle Abhängigkeiten sind

compile 'com.android.support:support-v4:24.2.1' 
compile 'com.android.support:appcompat-v7:24.2.1' 
compile 'com.google.android.gms:play-services:+' 

Was hier bin ich fehlt? Wie kann ich die Berechtigung in dem Fragment verwenden und warum googleMap ist leer?

Antwort

0

Verschieben dieser Code von Ihrem onCreateView auf Ihre onMapReady:

// Detect location 
googleMap.setMyLocationEnabled(true); 
googleMap.getUiSettings().setMyLocationButtonEnabled(false); 
//googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
// Turns traffic layer on 
googleMap.setTrafficEnabled(true); 
// Enables indoor maps 
googleMap.setIndoorEnabled(true); 
// Enables indoor maps 
googleMap.setIndoorEnabled(true); 
// Turns on 3D buildings 
googleMap.setBuildingsEnabled(true); 
// Show Zoom buttons 
googleMap.getUiSettings().setZoomControlsEnabled(true); 
// latitude and longitude 
double latitude = 40.639350; 
double longitude = 22.944607; 

googleMap.setOnMapLongClickListener(this); 
googleMap.setOnMapClickListener(this); 


// create marker 
MarkerOptions thessaloniki = new MarkerOptions().position(new LatLng(latitude, longitude)).title("Thessaloniki"); 

// Changing marker icon 
thessaloniki.icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_ROSE)); 

// adding marker 
googleMap.addMarker(thessaloniki); 
CameraPosition cameraPositionThess = new CameraPosition.Builder() .target(new LatLng(40.639350, 22.944607)).zoom(12).build(); 
googleMap.animateCamera(CameraUpdateFactory .newCameraPosition(cameraPositionThess)); 

Die Linie mMapView.getMapAsync(this); bereitet die Karte und onMapReady aufgerufen wird, wenn die Karte bereit ist, verwendet werden.

Auch wenn Sie private GoogleMap googleMap; definiert haben, werden Sie wollen, dies zu Beginn Ihrer onMapReady Methode hinzufügen:

this.googleMap = googleMap; 
+0

tat ich das, aber die App stürzt wieder, wenn die Karte Fragment auswählen. Ich bekomme immer noch eine Unterstreichung auf 'googleMap.setMyLocationEnabled (true);' für permissoin check – Kzaf

+0

Durch das Auskommentieren der 'googleMap.setMyLocationEnabled (true);' Ich bekomme das Map-Fragment zu laufen, aber ich bekomme jetzt eine leere Karte. Wenn ich wieder die 'googleMap.setMyLocationEnabled (true);} verwende, stürzt meine App ab. Wie kann ich den Permission-Check und die leere Karte beheben? – Kzaf

Verwandte Themen