3

複数のマップを処理するための最良の方法を決定しようとしています。単一のマップに物事を追加および削除するか、2つのマップフラグメントを切り替える必要があります。戻るボタンを簡単に利用できるので、フラグメントを操作する方が理想的だと思います。

ボタンクリックで複数のマップフラグメントをshow()およびhide()しようとすると、問題が発生します。show()/ hidden()を使用してもマップは変更されません。たぶん誰かが私のためにこれが起こっている理由にいくつかの光を当てることができるので、私はショーと非表示のマップビューで実際に何が起こっているのかをよりよく理解することができます。マップフラグメントの表示と非表示に問題があった人はいますか?

ボタンをクリックしてもマップビューは変更されませんが、ボタンをもう一度クリックしない限り制御できなくなります。フラグメントが切り替わっているように見えますが、実際にはビューが変更されていません。replace()を使用して正しく機能することは確かですが、これはマップをロードする目的を無効にします。

package com.test.googletestmaps;
public class ControlFragment extends SherlockFragmentActivity implements
    OnClickListener {

private GoogleMap mMap;
private GoogleMap mMap2;
private SupportMapFragment gmap;
private SupportMapFragment gmap2;
private ImageButton button;
private int mapShown;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_control_fragment);
    gmap = ((SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map1));
    gmap2 = ((SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map2));

    if (savedInstanceState == null) {
        // First incarnation of this activity.
        gmap.setRetainInstance(true);
    } else {
        // Reincarnated activity. The obtained map is the same map instance
        // in the previous
        // activity life cycle. There is no need to reinitialize it.
        mMap = gmap.getMap();
    }
    if (savedInstanceState == null) {
        // First incarnation of this activity.
        gmap2.setRetainInstance(true);
    } else {
        // Reincarnated activity. The obtained map is the same map instance
        // in the previous
        // activity life cycle. There is no need to reinitialize it.
        mMap2 = gmap2.getMap();
    }
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.hide(gmap2);
    ft.commit();
    button = ((ImageButton) findViewById(R.id.cacbutton));
    button.setOnClickListener(this);
    button.setVisibility(View.VISIBLE);
    mapShown = 0;
    setUpMapIfNeeded();
}

@Override
protected void onResume() {
    super.onResume();
    setUpMapIfNeeded();
}

private void setUpMapIfNeeded() {
    // Do a null check to confirm that we have not already instantiated the
    // map.
    if (mMap == null) {
        // Try to obtain the map from the SupportMapFragment.
        mMap = ((SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map1)).getMap();
        // Check if we were successful in obtaining the map.
        if (mMap != null) {
            setUpMap(0);
        }

    }
    if (mMap2 == null) {
        mMap2 = ((SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map2)).getMap();

        if (mMap2 != null) {
            setUpMap(1);
        }
    }
}

private void setUpMap(int mapNumber) {
    switch (mapNumber) {
    case 0:
        mMap.getUiSettings().setZoomControlsEnabled(true);
        mMap.addMarker(new MarkerOptions().position(new LatLng(5, 5)).title("Marker for map1"));
        break;
    case 1:
        mMap2.getUiSettings().setZoomControlsEnabled(true);
        mMap2.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker for map2"));
        break;
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu with the options to show the Map and the ListView.
    getSupportMenuInflater()
            .inflate(R.menu.activity_control_fragment, menu);
    return true;
}

@Override
public void onClick(View v) {
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
    if (mapShown == 0)
    {
        ft.hide(gmap);
        ft.show(gmap2);
        mapShown = 1;
    }
    else
    {
        ft.hide(gmap2);
        ft.show(gmap);
        mapShown = 0;

    }
    ft.addToBackStack(null);
    ft.commit();

}
}

編集:マップフラグメントを表示および非表示にする方法を説明するこのgetView().setVisibility()リンクを見つけました。使用してみましたが、同じ結果が得られます。

編集:これは明らかに簡単に解決できるものではありません。私は周りを見回しましたが、これに対する解決策を見つけることができません。今のところ、フラグメントを制御するために追加/削除を使用します。

これはまだ解決されていません....私は別のルートを取りました。フラグメントの表示/非表示は、新しいGoogleマップフラグメントの複数のインスタンスでは機能しません。理由はわかりません。この問題の解決策や理由を見つけた場合は、投稿して共有してください。

4

1 に答える 1

2

この問題に直面して、解決策を検索した後、いくつかの役立つリンクを見つけました。

Maps API v2 を使用して MapFragment をプログラムで初期化する

アクション バー タブの複数のマップ フラグメント

TabActivity の複数マップ v2

1 つのアプリケーションで 2 つのマップ フラグメントを使用する際の問題

ViewPager で複数の SupportMapFragment を使用して最初のマップのみが表示される

複数の MapFragment のパフォーマンス (Android Map API v2)

しかし、私は自分のスタイルでそれを行うことにしました:

これは、フラグメントが同じ に属している場合に、Activity複数のマップ フラグメントをナビゲートする方法です。map fragments別のものに属している場合Activity(つまり、MapFragmentごとに 1 つActivity)、この問題は、少なくとも私の場合は Android OS によって管理されていたので、特別なことは何もすべきではありません。

           case 1:
                if(getActivity().getSupportFragmentManager().findFragmentById(R.id.map_fragment1) == null){

                    if(getActivity().getSupportFragmentManager().findFragmentById(R.id.map_fragment2) != null){
                        FragmentManager manager = getActivity().getSupportFragmentManager();
                        FragmentTransaction ft = manager.beginTransaction();
                        ft.remove(getActivity().getSupportFragmentManager().findFragmentById(R.id.map_fragment2));
                        ft.commit();
                    }

                    FragmentManager manager1 = getActivity().getSupportFragmentManager();
                    FragmentTransaction ft1 = manager1.beginTransaction();
                    ft1.replace(R.id.frame_mapView, new Map1Fragment());
                    ft1.commit();
                }


                break;

            case 3:

                if(getActivity().getSupportFragmentManager().findFragmentById(R.id.map_fragment2) == null){

                    if(getActivity().getSupportFragmentManager().findFragmentById(R.id.map_fragment1) != null){

                        FragmentManager manager = getActivity().getSupportFragmentManager();
                        FragmentTransaction ft = manager.beginTransaction();
                        ft.remove(getActivity().getSupportFragmentManager().findFragmentById(R.id.map_fragment1));
                        ft.commit();
                    }

                    FragmentManager manager1 = getActivity().getSupportFragmentManager();
                    FragmentTransaction ft1 = manager1.beginTransaction();
                    ft1.replace(R.id.frame_mapView, new Map2Fragment());
                    ft1.commit();
                }
         break;

whereMap1FragmentMap2Fragment、それぞれ、 extends Fragmentを含む XML レイアウトをインフレートします。

<fragment
        android:id="@+id/map_fragment1"
        class="com.google.android.gms.maps.SupportMapFragment"
        />

SupportMapFragmentただし、必要に応じてだけを拡張することもできます。

于 2013-04-25T10:39:24.653 に答える