Android - IllegalStateException: карта имеет нулевой размер - программирование
Подтвердить что ты не робот

Android - IllegalStateException: карта имеет нулевой размер

Я начинающий программист-программист.

Позвольте мне привести некоторый контекст.
В моем проекте используется ActionBarSherlock.

  • У меня есть активность (Activity1), которая содержит два фрагмента - SherlockListFragment и SherlockFragment, содержащие карты google MapView (в основном MapFragment).
  • Результаты поиска отображаются в фрагменте списка и фрагменте карты, а кнопка параметров панели действий переключает отображаемый в настоящее время фрагмент между списком и картой.
  • Выбор элемента в списке или карта результатов поиска запускает новое действие (Activity2), отображающее данные из выбранного элемента.
  • В этом новом действии есть аналогичный поток: фрагмент, чтобы показать данные, и фрагмент карты, чтобы показать местоположение, переключаемое кнопкой параметров панели действий.

Проблема:

  • Я могу выбрать элемент списка в фрагменте списка результатов поиска (Activity1), и страница сведений (Activity2) успешно запущена.
  • Когда я выбираю элемент карты из наложения карты в (Activity1), приложение выходит из строя, и я получаю стек, который показан ниже.

Что я пробовал до сих пор:

  • Я искал "карта имеет нулевой размер" и множество перестановок одного и того же поиска, включая "android" и "wrongstateexception" и различные строки stacktrace, и я изучил результаты, которые даже не связаны с Android, но относятся к google-картам apis в целом, и я не смог найти никого или кого-либо еще, кто столкнулся с этой ошибкой, за исключением этого url http://www.androidpub.com/1551654 Но я не знаю корейский, и Google translate не помог.
  • Я попытался найти некоторые фрагменты исходного кода, чтобы узнать, что происходит, но ничего не получилось.
  • Я добавил журналы в свой код, чтобы попытаться определить, где произошло исключение, и все, что я смог найти, это то, что он происходит через некоторое время после (Activity2), когда начинается действие сведений, то есть после onCreate ( ) называется. И фрагмент деталей, и фрагмент карты были успешно созданы в onCreate(). Я даже не смог найти место в своем коде, чтобы поймать исключение. Поэтому для всего, что я вижу, это исключение, по-видимому, является полностью ошибкой в ​​коде Google MapView, но если я допустил ошибку в любом месте, пожалуйста, покажите это. Я открыт для всех, кто может рассказать мне, что здесь происходит.

Итак, в резюме. Сбой происходит при переходе от активности (Activity1) с отображением в настоящее время карты к другому действию (Activity2), в котором также размещен фрагмент, содержащий другое mapview. Но авария не возникает при переходе от фрагмента списка, отображаемого в (Activity1) к другому действию (Activity2), содержащему другой фрагмент карты.

Надеюсь, этого достаточно. Если у вас есть какие-либо вопросы, прокомментируйте пожалуйста.

D/memalloc(  121): /dev/pmem: Allocated buffer base:0x4215c000 size:2088960 offset:4177920 fd:66
D/memalloc(30944): /dev/pmem: Mapped buffer base:0x5b4f5000 size:6266880 offset:4177920 fd:164
D/AndroidRuntime(30944): Shutting down VM
W/dalvikvm(30944): threadid=1: thread exiting with uncaught exception (group=0x40aaa228)
E/AndroidRuntime(30944): FATAL EXCEPTION: main
E/AndroidRuntime(30944): java.lang.IllegalStateException: Map has zero size
E/AndroidRuntime(30944):    at android_maps_conflict_avoidance.com.google.googlenav.map.Map.drawMap(Map.java:818)
E/AndroidRuntime(30944):    at com.google.android.maps.MapView.drawMap(MapView.java:1091)
E/AndroidRuntime(30944):    at com.google.android.maps.MapView.onDraw(MapView.java:522)
E/AndroidRuntime(30944):    at android.view.View.draw(View.java:11071)
E/AndroidRuntime(30944):    at android.view.View.getDisplayList(View.java:10462)
E/AndroidRuntime(30944):    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605)
E/AndroidRuntime(30944):    at android.view.View.getDisplayList(View.java:10425)
E/AndroidRuntime(30944):    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605)
E/AndroidRuntime(30944):    at android.view.View.getDisplayList(View.java:10425)
E/AndroidRuntime(30944):    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605)
E/AndroidRuntime(30944):    at android.view.View.getDisplayList(View.java:10425)
E/AndroidRuntime(30944):    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605)
E/AndroidRuntime(30944):    at android.view.View.getDisplayList(View.java:10425)
E/AndroidRuntime(30944):    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605)
E/AndroidRuntime(30944):    at android.view.View.getDisplayList(View.java:10425)
E/AndroidRuntime(30944):    at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:879)
E/AndroidRuntime(30944):    at android.view.ViewRootImpl.draw(ViewRootImpl.java:1948)
E/AndroidRuntime(30944):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1654)
E/AndroidRuntime(30944):    at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2498)
E/AndroidRuntime(30944):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(30944):    at android.os.Looper.loop(Looper.java:154)
E/AndroidRuntime(30944):    at android.app.ActivityThread.main(ActivityThread.java:4894)
E/AndroidRuntime(30944):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(30944):    at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(30944):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
E/AndroidRuntime(30944):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
E/AndroidRuntime(30944):    at dalvik.system.NativeStart.main(Native Method)
E/EmbeddedLogger(  254): App crashed! Process: com.myapp.android
E/EmbeddedLogger(  254): App crashed! Package: com.myapp.android v5 (2.0)
E/EmbeddedLogger(  254): Application Label: myapp
W/ActivityManager(  254):   Force finishing activity com.myapp.android/.activity.InfoActivity
W/ActivityManager(  254):   Force finishing activity com.myapp.android/.activity.SearchActivity
4b9b3361

Ответ 1

В этот момент, по моему опыту, единственный способ избежать этой ошибки - не использовать MapView внутри Fragments. Перемещение MapView вообще связано с тем, что анимация или фальсификация ее позиции после ее добавления в родительский вид всегда вызывали у меня проблемы. Наиболее эффективным способом, который я нашел, является переключение между картой и другим представлением, в котором MapActivity управляет MapView, а фрагмент управляет другим представлением. Я снова реализовал ту же функцию, и это без проблем. Тем не менее, я бы заметил, что это обходной путь для проблемы с неизвестной причиной (скорее всего, ошибка в API-интерфейсах Android).

Ответ 2

Я абсолютно не согласен с Адамом! Управление фрагментами и действиями - лучшая практика.

Это совсем другое, и иногда даже сложнее что-то выдумать, но управлять фрагментом карты как самим фрагментом или внутри другого фрагмента, который будет использоваться несколькими действиями, - это лучшее, что вы можете сделать, если планируете включать карты в нескольких представлениях вашего приложения.

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

И в этом случае исключение будет в строке map.animateCamera(...), потому что вы имеете дело с тем, что доступно, но оно еще не завышено.

попробуйте следующее:

try{
        cu = CameraUpdateFactory.newLatLngBounds(yourBoundaries,yourPadding);
        map.animateCamera(cu);
        System.out.println("Set with padding");
    } catch(IllegalStateException e) {
        e.printStackTrace();
        cu = CameraUpdateFactory.newLatLngBounds(yourBoundaries,someWidth,someHeight,zeroPadding);
        map.animateCamera(cu);
        System.out.println("Set with whp");
    }