4

Я просто переключился на новейшую версию Android-карт-расширений (2.2.0) вместе с новейшими Play Services (6.5.87) и поддержкой библиотеки (21.0.3). И теперь я не могу повторно использовать свой MapFragment.Как повторно использовать SupportMapFragment внутри другого фрагмента

У меня есть MainActivity с NavigationDrawer. Один из фрагментов - фрагмент с фрагментом 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; 
} 

Но теперь это не работает. Карта не отображается, когда этот фрагмент открывается во второй раз.

я могу просто выбросить этот уродливый код

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

И всегда воссоздают вид с внутренней стороны. Но у меня есть тысячи маркеров (конечно, с удивительной кластеризацией), и это занимает много времени, чтобы перекрасить их.

Я знаю, что это не проблема библиотеки расширений, Google Maps имеют такое же поведение. Но, может быть, вы знаете правильное решение?

+0

Тот же вопрос здесь. Кажется, это ошибка библиотеки воспроизведения. – zyamys

ответ

3

Вместо использования MapFragment мы можем использовать MapView, который существует и в androidmapsextensions. И его можно использовать повторно.

С добавлением MapView программно, необходимо вызвать mapView.onCreate (расслоение)

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); 
      } 
     }); 
    } 
} 
Смежные вопросы