アプリケーション内でマップフラグメントを機能させようとしていますが、GoogleMapオブジェクトを取得しようとするとエラーが発生し続けます。
FragmentWithMap.Java
import Android.Manifest;
import Android.app.Activity;
import Android.content.pm.PackageManager;
import Android.net.Uri;
import Android.os.Bundle;
import Android.support.v4.app.ActivityCompat;
import Android.support.v4.app.Fragment;
import Android.util.Log;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import com.google.Android.gms.maps.CameraUpdate;
import com.google.Android.gms.maps.CameraUpdateFactory;
import com.google.Android.gms.maps.GoogleMap;
import com.google.Android.gms.maps.SupportMapFragment;
import com.google.Android.gms.maps.model.BitmapDescriptorFactory;
import com.google.Android.gms.maps.model.LatLng;
import com.google.Android.gms.maps.model.Marker;
import com.google.Android.gms.maps.model.MarkerOptions;
public class FragmentWithMap extends Android.support.v4.app.Fragment {
private OnFragmentInteractionListener mListener;
private static final double LAT = 32.084;
private static final double LON = 34.8878;
Place place;
private GoogleMap mMap;
private View view;
private Marker marker;
int userIcon = FragmentWithDetails.userIcon;
public static FragmentWithMap newInstance(Place place) {
Bundle args = new Bundle();
if (place != null) {
args.putInt("id", place.getId());
args.putString("name", place.getName());
args.putString("address", place.getAddress());
args.putFloat("lat", place.getLat());
args.putFloat("lng", place.getLng());
}
FragmentWithMap fragment = new FragmentWithMap();
fragment.setArguments(args);
return fragment;
}
public FragmentWithMap() {
//empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null && getArguments().getString("name") != null) {
place = new Place(getArguments().getInt("id"), getArguments().getString("name"),
getArguments().getString("address"), getArguments().getFloat("lat"),
getArguments().getFloat("lng"));
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (view == null) {
view = inflater.inflate(R.layout.fragment_fragment_with_map, container, false);
}
setUpMapIfNeeded();
return view;
}
@Override
public void onDestroyView() {
super.onDestroyView();
Android.support.v4.app.Fragment f = getFragmentManager()
.findFragmentById(R.id.fragmnet_container_map);
if (f != null) {
try {
getFragmentManager().beginTransaction().remove(f).commit();
} catch (IllegalStateException ise) {
Log.d("FragmentWithMap", "Already closed");
}
}
ViewGroup parentViewGroup = (ViewGroup) view.getParent();
if (parentViewGroup != null) {
parentViewGroup.removeAllViews();
}
}
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnFragmentInteractionListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
public void showPlace(Place place) {
setPlace(place);
setUpMap();
}
public void setPlace(Place place) {
this.place = place;
}
public interface OnFragmentInteractionListener {
public void onFragmentInteraction(Uri uri);
}
private void setUpMapIfNeeded() {
// Do a null check
if (mMap == null) {
// Try to obtain the map from the SupportMapFragment.
Fragment mmm = getChildFragmentManager().findFragmentById(R.id.fragment_map2);
mMap = ((SupportMapFragment) mmm).getMap();
// Check if we were successful
if (mMap != null) {
setUpMap();
}
}
}
private void setUpMap() {
double lat = LAT;
double lng = LON;
String name = "You are here";
if (place != null) {
lat = place.getLat();
lng = place.getLng();
name = place.getName();
}
if (marker != null) {
marker.remove();
}
LatLng position = new LatLng(lat, lng);
MarkerOptions markerOptions = new MarkerOptions().
position(position).
title(name).
icon(BitmapDescriptorFactory.fromResource(userIcon)).
snippet("Your last recorded location");
marker = mMap.addMarker(markerOptions);
if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
mMap.setMyLocationEnabled(true);
CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(position, 15);
mMap.animateCamera(cameraUpdate);
}
}
そして、これがXMLです
fragment_with_map.xml
<fragment xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools" Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:id="@+id/fragment_map2"
tools:context="com.example.eldad.myplacesapp.FragmentWithMap"
Android:name="com.google.Android.gms.maps.SupportMapFragment"
/>
メソッドgetMap()が非推奨になっている別のアプリからコードをコピーしたため、コード自体に問題があるのではないかと疑っています。廃止されることに問題はありません。必要がない場合はgetMapAsync()を使用しないことを好みます。しかし、ここで何らかの理由で私はエラーを受け取ります
「メソッド 'getMap()'を解決できません」
。私もエラーを受け取ります
「エラー:タスク ':app:compileDebugJavaWithJavac'の実行に失敗しました。
コンパイルに失敗しました。詳細については、コンパイラエラーの出力を参照してください。」
この問題に関係しているかどうかはわかりませんが。
getMap()
メソッドは以前は非推奨でしたが、現在は削除されています。 SupportMapFragmentのドキュメント を見ると、そこにはありません。
リリースノート でも確認できます。
以前に非推奨になったgetMap()関数は、Google Play開発者サービスSDKでは使用できなくなりました。 (Androidデバイスに配信されるGoogle PlayサービスAPKで引き続き利用可能です。)getMap()関数は2014年12月以降廃止されました。 リリースブログ投稿 getMap()からgetMapAsync()への変換に関するヘルプ。
そしてブログ投稿から:
2014年12月、getMap()を廃止し、getMapAsync()を採用しました。このリリース以降、アプリをコンパイルするにはgetMapAsync()を使用する必要があります。
したがって、getMapAsync()を使用するだけで簡単です。
まず、フラグメントにOnMapReadyCallbackインターフェースを実装させます。
public class FragmentWithMap extends Android.support.v4.app.Fragment
implements OnMapReadyCallback {
次に、setUpMapIfNeeded()コードを変更し、onMapReady()コールバックを追加します。
private void setUpMapIfNeeded() {
if (mMap == null) {
SupportMapFragment mapFrag = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.fragment_map2);
mapFrag.getMapAsync(this);
}
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
setUpMap();
}
これを使って
compile 'com.google.Android.gms:play-services-location:8.4.0'
map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(
R.id.map)).getMap();