2017-04-30 10 views
0

ナビゲーション・ドロワー上のマップ・フラグメントを使用している古いアプリケーションを開発し始めました。それはOKを動作するために使用されましたが、今、新しいpermissonの事で、私はいくつかのエラーを取得します。私はSOと一般的にインターネットで検索しましたが、私は何が欠けているのか分かりません。マイマップの断片は、私はマップを取得するためにgoogleMap = mMapView.getMap();を使用しますが、私はOnMapReadyCallbackを実装することによりmMapView.getMapAsync(this);でそれを変更して、それが私はそれがonCreateView異なっているか知らないonMapReady方法を、作成するために私を余儀なくさAndroid:ナビゲーション・ドロワーの地図断片とエラー・チェック

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

を下回っています私はそれを空のままにする方法。

許可のためにgoogleMap.setMyLocationEnabled(true);にエラーが発生し、私のアプリケーションをデバッグするときにgoogleMapオブジェクトがnullになりました。 私はそれを実行すると、マップフラグメントを選択すると、アプリケーションがクラッシュし、フラグメントを保持するアクティビティが終了します。マニフェストで

私は

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

を持っていると私のGradleの依存関係は、私がここで何を

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:+' 

をしないのですされていますか?フラグメントのパーミッションを使用するにはどうすればよいですか、googleMapが空である理由を教えてください。あなたのonCreateViewからごonMapReady

答えて

0

移動し、このコード:

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

ラインmMapView.getMapAsync(this);は、マップを作成し、マップを使用する準備ができたときonMapReadyが呼び出されます。

this.googleMap = googleMap; 
+0

マップフラグメントを選択するとき、私は再びこのしかし、アプリのクラッシュをした:あなたはprivate GoogleMap googleMap;を定義している場合

また、あなたはあなたのonMapReadyメソッドの先頭にこれを追加することになるでしょう。私はまだ 'googleMap.setMyLocationEnabled(true);のパーミッションチェックの下線を受け取ります。 – Kzaf

+0

' googleMap.setMyLocationEnabled(true);をコメントアウトすることによって、マップフラグメントを実行することができますが、今は空のマップが得られます。私が再び 'googleMap.setMyLocationEnabled(true);を使うと、私のアプリがクラッシュします。許可チェックと空白地図を修正するにはどうすればよいですか? – Kzaf

関連する問題