14

バックグラウンド

新しいマップAPIv2.0をViewPagerに正常に追加しましたが、マップは正常に読み込まれます。FragmentViewPagerを使用しています。ただし、使用しているViewPagerは互換性ライブラリからXMLで定義されているため、タグごとのフラグメントを取得できないため、マーカーを追加しようとすると問題が発生します。これにより、タグが「非表示」になります。

質問

を使用するSupportMapFragmentに、マーカー付きの新しいMapv2をロードするにはどうすればよいですか。ViewPagerFragmentPagerAdapter

私の試み

ですから、私は、SupportMapFragmentを次のことを行う新しいクラスに拡張することで、洗練されたソリューションを作成できると思いました。

  1. GoogleMapOptionsとをとる新しいコンストラクターを追加しますList<MarkerOptions>GoogleMapsOptionsこれにより、マーカーのリストを取得して新しいクラスのプライベートプロパティ内に格納する既存のコンストラクターが効果的に呼び出されます。
  2. オーバーライド-nullGetMap()であるかどうか、および以前にマップにロードしたマップにマーカーが追加されていないかどうかを確認し、最後にそれを返します。

私の考えでは、私の拡張機能は再利用性が高く、1つの場所に関連するすべてのマップを抽象化し、アクティビティで新しいMapFragmentを作成できるようになりますnewInstance(myGoogleMapOptions, myMarkers)

さて、問題です。パート1は正常に機能しているようですが、デバッグ中に、オーバーライドされたGetMap()メソッドを呼び出すことができません。実際、フラグメントが持つ通常のメソッドのほとんどをオーバーライドしようとしましたが、いずれも呼び出されません。SupportMapFragmemtで何か奇妙なことが起こっていますか?私はそれのソースを見つけようとしましたが、自分でチェックすることはできませんでした。

アップデート

オーバーライドされたメソッドが呼び出されなかった理由に気づきました。それは私がではSupportMapFragmentなく標準を返していたからですMyMapFragment。つまり、静的メソッドからsuperを呼び出すことはできず、例外なく基本クラスから派生クラスにキャストすることはできません。

編集 ここにクラスがあります

public class MyMapFragment extends SupportMapFragment {

    private static List<MarkerOptions> mMarkers;

    public static SupportMapFragment newInstance(GoogleMapOptions options, List<MarkerOptions> markers)
    {
        SupportMapFragment fragment = newInstance(options);

        mMarkers = markers;

        return fragment;

    }

            //have tried Overriding several methods including getMap()...

    @Override
    public void onResume ()
    {
        GoogleMap mMap = super.getMap();
        //add the markers
        if(mMap != null)
        {
            for(MarkerOptions marker : mMarkers)
            {
                mMap.addMarker(marker);
            }
        }

    }

}
4

1 に答える 1

24

このように試してみて、うまくいきます。

public class MyMapFragment extends SupportMapFragment {

    private List<MarkerOptions> mMarkers;

    public static MyMapFragment create(GoogleMapOptions options, ArrayList<MarkerOptions> markers) {
        MyMapFragment fragment = new MyMapFragment();

        Bundle args = new Bundle();
        args.putParcelable("MapOptions", options); //obtained by decompiling google-play-services.jar
        args.putParcelableArrayList("markers", markers);
        fragment.setArguments(args);

        return fragment;
    }

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

        // Hacky and ugly but it works
        ArrayList<Parcelable> list = getArguments().getParcelableArrayList("markers");
        mMarkers = new ArrayList<MarkerOptions>(list.size());
        for (Parcelable parcelable : list) {
            mMarkers.add((MarkerOptions) parcelable);
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        GoogleMap mMap = super.getMap();
        //add the markers
        if (mMap != null) {
            for (MarkerOptions marker : mMarkers) {
                mMap.addMarker(marker);
            }
        }
    }
}
于 2012-12-09T00:29:40.223 に答える