Можно ли использовать MapView с FragmentManager и ListFragment

#android

#Android

Вопрос:

Мое приложение использует ListFragment с левой стороны, который пользователь может использовать, чтобы выбрать, какой фрагмент использовать с правой стороны.

В sort кажется невозможным показать MapView более одного раза. Первая проблема заключается в том, что он разрешает только один экземпляр MapView для каждого действия.

 # Exception 1:
You are only allowed to have a single MapView in a MapActivity
 

Поэтому я сохранил свой MapView и контейнер в классе Activity:

 public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   FragmentManager.enableDebugLogging(true);
   setContentView(R.layout.main);
   mapViewContainer = LayoutInflater.from(this).inflate(R.layout.maplayout, null);
   mapView = (MapView) mapViewContainer.findViewById(R.id.map_view); 
}
 

Однако это вызывает у меня следующую проблему:

 # Exception 2:
The specified child already has a parent. 
You must call removeView() on the child’s parent first.
 

Я попытался удалить представление, используя этот код:

 ((ViewGroup)mapViewContainer).removeView(mapView);
((ViewGroup)mapView.getParent()).removeView(mapView);
 

Получил NullPointerExeption.

Я был бы признателен за любые хорошие идеи или если бы вы могли поделиться, если вам удалось это сделать?

Спасибо 🙂

Ответ №1:

Да, я тоже столкнулся с этим.

Не добавляйте свой MapView в файл XML-макета для вашего фрагмента. Вместо этого просто оставьте для него место, скажем, в LinearLayout с id=»@ id/your_map_container_id»

Объявите закрытый элемент MapView в yourmapcontainerfragment’s:

 public class YourMapContainerFragment extends Fragment {
    private MapView mMapView;
    //...
 

Затем выполните следующие действия в onCreateView YourMapContainerFragment():

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // ... Inflate your fragment's layout...
    // ...
    if (mMapView == null) {
        mMapView = new MapView(getActivity(), /*String*/YOUR_MAPS_API_KEY);
    } else {
        ((ViewGroup)mMapView.getParent()).removeView(mMapView);
    }
    ViewGroup mapContainer = (ViewGroup) fragmentLayout.findViewById(R.id.your_map_container_id);
    mapContainer.addView(mMapView);
    // ...
}
 

Это приведет к повторному использованию одного и того же объекта MapView при удалении / добавлении вашего фрагмента в activity.

Комментарии:

1. Спасибо, я проверю, работает ли у меня тоже через пару дней. Я действительно благодарен.

2. Большое вам спасибо! Я потратил предыдущие 3-4 часа своей ночи на это! Я понял, что происходит, но потерпел неудачу, поскольку пытался сохранить один и тот же MapView для многократного использования. Хотел бы я дать вам второй 1, ха-ха.

3. Спасибо за ваш ответ. В этом случае, если я добавлю кнопку на карте с RelativeLayout, почему кнопка не отображается? Пожалуйста, помогите.

4. Ну, это действительно зависит от того, как вы это делаете. Кроме того, отображается ли кнопка, когда вы не используете метод повторного подключения из ответа?