Для моего приложения я должен добиться чего-то близкого к пусковой установке: я должен предоставить возможность динамически добавлять, удалять, изменять размер и перетаскивать и перетаскивать некоторые элементы пользовательского интерфейса (назовем их «виджетами», но они не являются Android AppWidgets). Он работает довольно хорошо, но один из этих «виджетов» содержит MapFragment, и я не могу добавить его дважды, ни удалить, ни добавить снова.

На данный момент каждый «виджет» наследуется от FrameLayout. MapFragment загружается из xml. Проблема в том, что мы не можем установить идентификатор фрагмента по коду, и если я сделаю это в xml, у меня, очевидно, будет один и тот же идентификатор для всех моих карт. Итак, я получаю это исключение:

03-20 09:55:35.078: E/AndroidRuntime(19507):
Caused by: java.lang.IllegalArgumentException:
Binary XML file line #24: Duplicate id 0xffffffff, tag map,
or parent id 0xffffffff with another fragment for
com.google.android.gms.maps.MapFragment

Вот код фрагмента:

...
<fragment
    android:tag="map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="com.google.android.gms.maps.MapFragment" />
...

View.inflate(getContext(), layout, R.layout.widget_map);

Итак, я здесь, полностью застрял ^^. Я уже просматриваю stackoverflow и Интернет, но не нашел решения.

Более того, я использую Android Maps API V2, и я получаю некоторую печать GC в консоли каждый раз, когда я меняю ориентацию экрана (поэтому, когда карта перерисовывается), должен ли я беспокоиться о них?

03-20 10:02:41.820: D/dalvikvm(19650): GC_CONCURRENT freed 1929K, 17% free 11579K/13940K, paused 3ms+4ms, total 44ms
03-20 10:02:42.250: D/dalvikvm(19650): GC_CONCURRENT freed 382K, 14% free 12123K/13940K, paused 3ms+13ms, total 67ms
03-20 10:02:42.250: D/dalvikvm(19650): WAIT_FOR_CONCURRENT_GC blocked 51ms
03-20 10:02:42.328: D/dalvikvm(19650): GC_CONCURRENT freed 2114K, 21% free 11099K/13940K, paused 2ms+2ms, total 45ms
03-20 10:02:42.328: D/dalvikvm(19650): WAIT_FOR_CONCURRENT_GC blocked 32ms

Любой совет приветствуется !

1
Tim Autin 20 Мар 2013 в 13:18

1 ответ

Лучший ответ

Вы пробовали присвоить разные id разным картам?

    android:id="@+id/map1"

    android:id="@+id/map2" // etc...

В противном случае вы можете использовать setId() на ваши взгляды.

Если работа с Fragment не работает, вы можете добавить

<com.google.android.gms.maps.MapView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/map1"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

В вашем XML и настройте его в своем коде. См. Код Google Maps V2 Demo RawMapViewDemoActivity.

Что касается вызовов GC, я бы не стал беспокоиться, MapView требует много памяти, а поворот экрана уничтожает и воссоздает все ваши представления, так что это нормальное явление.

0
minipif 20 Мар 2013 в 13:34
Спасибо за ваш ответ. Я пробовал использовать MapViews, и он работает, но, используя MapViews, мне приходится перенаправлять все функции жизненного цикла деятельности моему «виджету», что довольно раздражает: /. Для фрагментов я не могу указать разные идентификаторы: я использую один и тот же XML-файл для загрузки нескольких фрагментов. Итак, в XML я не могу установить идентификатор, потому что, если я это сделаю, он будет одинаковым для всех моих фрагментов, и я не могу сделать это с помощью кода, потому что ... Мы не можем установить идентификатор фрагмента с помощью кода> <!! …
 – 
Tim Autin
20 Мар 2013 в 19:15
... Хорошо для вызовов GC ... Я написал несколько статей об API V2 и утечках памяти, похоже, что Google выпустил его в ближайшее время (и, кроме того, ИМХО есть ОГРОМНЫЙ недостаток функциональности / гибкости: /). Если вы решите продолжить работу с MapViews, я приму ваш ответ, спасибо!
 – 
Tim Autin
20 Мар 2013 в 19:16