4

最新バージョンの android-maps-extensions (2.2.0) と最新の Play サービス (6.5.87) およびサポート ライブラリ (21.0.3) に切り替えました。そして今、MapFragment を再利用できません。

私は NavigationDrawer で MainActivity を持っています。フラグメントの 1 つは、内部に GoogleMap フラグメントを含むフラグメントです。NavigationDrawer でフラグメントを切り替えると、フラグメント自体が再作成されます。以前は、これに対して非常に単純なソリューションを使用していました。私はすでに膨らんだビューを使用しました:

 public View onCreateView(LayoutInflater inflater, ViewGroup container, final Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    if (view != null) {
        ViewGroup parent = (ViewGroup) view.getParent();
        if (parent != null) {
            parent.removeView(view);
        }
        return view;
    }
    view = inflater.inflate(R.layout.fragment_map, container, false);

    SupportMapFragment mapFragment = SupportMapFragment.newInstance();
    FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
    transaction.add(R.id.container, mapFragment).commit();

    mapFragment.getExtendedMapAsync(new OnMapReadyCallback() {
        public void onMapReady(GoogleMap googleMap) {
            map = googleMap;
            setupMap();
        }
    });

    return view;
}

しかし、今はうまくいきません。このフラグメントが 2 回目に開いたときにマップが表示されません。

私はこの醜いコードを捨てることができます

 if (view != null) {
        ViewGroup parent = (ViewGroup) view.getParent();
        if (parent != null) {
            parent.removeView(view);
        }
        return view;
    }

そして、常に内部でビューを再作成します。しかし、何千ものマーカーがあり (もちろん素晴らしいクラスタリングを使用)、それらを再描画するには多くの時間がかかります。

拡張ライブラリの問題ではないことはわかっています。Google マップも同じ動作をします。しかし、多分あなたは正しい決定を知っていますか?

4

1 に答える 1

3

MapFragment を使用する代わりに、androidmapsextensions にも存在する MapView を使用できます。そしてそれは再利用することができます。

MapView をプログラムで追加したため、mapView.onCreate(bundle)を呼び出す必要があります。

private MapView mapView;

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    View view = inflater.inflate(R.layout.fragment_map, container, false);

    if (mapView != null) {        
        ViewGroup parentViewGroup = (ViewGroup) mapView.getParent();
        if (parentViewGroup != null) {
            parentViewGroup.removeView(mapView);            
        }
    } else {
        mapView = new MapView(getActivity());
        mapView.onCreate(Bundle.EMPTY); //need if programmatically add 
    }    

    ((ViewGroup)view.findViewById(R.id.container)).addView(mapView);

    mapView.getExtendedMapAsync(new OnMapReadyCallback() {
        public void onMapReady(GoogleMap googleMap) {
            setUpMap(GoogleMap);
        }
    });    
}    

または、再利用された mapView の設定が必要ない場合

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    View view = inflater.inflate(R.layout.fragment_map, container, false);

    boolean needSetupMap = true;
    if (mapView != null) {        
        ViewGroup parentViewGroup = (ViewGroup) mapView.getParent();
        if (parentViewGroup != null) {
            parentViewGroup.removeView(mapView);
            needSetupMap = false;
        }
    } else {
        mapView = new MapView(getActivity());
        mapView.onCreate(Bundle.EMPTY);
    }  

    ((ViewGroup)view.findViewById(R.id.container)).addView(mapView);

    if (needSetupMap) {
        mapView.getExtendedMapAsync(new OnMapReadyCallback() {
            public void onMapReady(GoogleMap googleMap) {
                setUpMap(GoogleMap);
            }
        });
    }
}  
于 2015-03-16T17:07:31.397 に答える