Android Maps V2 MapView 内のカスタムフラグメント (NPE) 質問する

Android Maps V2 MapView 内のカスタムフラグメント (NPE) 質問する

またはを使用したり拡張したりしたくありませSupportMapFragmentMapFragment。大量のコードが入った独自の基本クラスがあります。

ドキュメントには、MapView単独で使用する場合、対応するライフサイクル メソッド (onCreate() onResume()など) をすべて呼び出す必要があることが明記されています。

のライフサイクル メソッドのほとんどはFragmentに似ていますActivityが、 と の間を行ったり来たり切り替えると、最終的にまたは メソッドでFragment難読化された NPE が発生します。onDestroy()onResume()

提供されているすべてのサンプルでは、Activity​​ とが使用されていますMapViewが、カスタム は使用されていませんFragment

MapViewすでに誰かがそれをやったことがありますか?自分のFragmentクラスでサンプル コードを提供できますか?

ベストアンサー1

私は PoPy の回答に少し苦労しましたが、最終的にはなんとか解決し、ここに私が思いついた答えがあります。おそらく、この問題に遭遇する他の人にとって役立つでしょう。

public class MyMapFragment extends Fragment {

    private MapView mMapView;
    private GoogleMap mMap;
    private Bundle mBundle;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View inflatedView = inflater.inflate(R.layout.map_fragment, container, false);

        try {
            MapsInitializer.initialize(getActivity());
        } catch (GooglePlayServicesNotAvailableException e) {
            // TODO handle this situation
        }

        mMapView = (MapView) inflatedView.findViewById(R.id.map);
        mMapView.onCreate(mBundle);
        setUpMapIfNeeded(inflatedView);

        return inflatedView;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBundle = savedInstanceState;
    }

    private void setUpMapIfNeeded(View inflatedView) {
        if (mMap == null) {
            mMap = ((MapView) inflatedView.findViewById(R.id.map)).getMap();
            if (mMap != null) {
                setUpMap();
            }
        }
    }

    private void setUpMap() {
        mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
    }

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

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

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

そして、これに対応するのがこれですres/layout/map_fragment.xml:

<?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" >

    <com.google.android.gms.maps.MapView
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>

この例のようにレイアウトに要素が 1 つしかない場合は、を省略できますRelativeLayout(そして、 xmlns 宣言を新しいルート要素 (この場合は ) まで移動します)。com.google.android.gms.maps.MapView

おすすめ記事