Intereting Posts
Скрытие просмотров в RecyclerView Пример Android AudioRecord Proguard gradle debug build, но не тесты Является ли подход клиентского приложения для остальных клиентов в google io 2010 актуальным? Android 2.3 эмулятор пустой экран после сборки Как использовать 32-разрядные собственные библиотеки на 64-битном Android-устройстве Скрыть часть меню навигационного ящика – Android Настройка темы приложения textColor на белый приводит к тому, что текст в тексте контекстного меню будет белым (невидимым) Измените TextInputLayout цвет акцента программным путем Проблемы с гироскопом с ориентацией устройства Android: загрузка вывода WebView в App Widget Android ImageView не отображает изображение? Настройка глобальных стилей для Views в Android Передача горизонтальных прокруток Android NestedScrollView в родительский вид Менеджер местоположений Android, получить местоположение GPS, если нет GPS, затем перейдите в местоположение поставщика сети

Mapbox Inflate View на фрагменте

У меня возникают проблемы с раздуванием Mapbox MapView на Android Fragment. Когда я использую тот же код в Activity (кроме стандартных различий между Activity и Fragment), я могу заставить MapView правильно загружаться, но не на Фрагмент.

В Mapbox также есть класс MapFragment, но я не уверен, как правильно его использовать во Фрагменте (пример все еще находится в Activity); С API Карт Google я могу использовать MapView на фрагменте без проблем.

Нижняя строка логарифма:

at com.example.exampleapp.FragmentMap.onCreateView(FragmentMap.java:133) 

Ссылается на строку Java:

 fragmentLayout = inflater.inflate(R.layout.fragment_map, container, false); 

Вот соответствующий код для этой проблемы вместе с журналом:

fragment_map.xml:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:mapbox="http://schemas.android.com/apk/res-auto" android:layout_width="fill_parent" android:layout_height="fill_parent" > <com.mapbox.mapboxsdk.views.MapView android:id="@+id/mapview" android:layout_width="match_parent" android:layout_height="match_parent" mapbox:access_token="@string/access_token"/> <android.support.v7.widget.CardView android:id="@+id/map_card" android:layout_width="100dp" android:layout_height="100dp" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_marginLeft="5dp" android:layout_marginTop="5dp"> <com.mapbox.mapboxsdk.views.MapView android:layout_width="100dp" android:layout_height="100dp" android:id="@+id/mini_map" android:layout_centerVertical="true" android:layout_centerHorizontal="true" mapbox:access_token="@string/access_token"/> </android.support.v7.widget.CardView> 

FragmentMap.java:

 public class FragmentMap extends Fragment { private MapView mv, miniMap; View fragmentLayout; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { fragmentLayout = inflater.inflate(R.layout.fragment_map, container, false); mv = (MapView) fragmentLayout.findViewById(R.id.mapview); mv.onCreate(savedInstanceState); miniMap = (MapView) fragmentLayout.findViewById(R.id.mini_map); miniMap.onCreate(savedInstanceState); return fragmentLayout; } @Override public void onStart() { super.onStart(); mv.onStart(); miniMap.onStart(); } @Override public void onStop() { super.onStop(); mv.onStop(); miniMap.onStop(); } @Override public void onDestroy() { super.onDestroy(); mv.onDestroy(); miniMap.onDestroy(); } @Override public void onResume() { super.onResume(); mv.onResume(); miniMap.onResume(); } @Override public void onPause() { super.onPause(); mv.onPause(); miniMap.onPause(); } @Override public void onLowMemory() { super.onLowMemory(); mv.onLowMemory(); miniMap.onLowMemory(); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mv.onSaveInstanceState(outState); miniMap.onSaveInstanceState(outState); } 

LogCat:

 01-07 08:07:00.548 710-710/com.example.exampleapp E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.exampleapp, PID: 710 android.view.InflateException: Binary XML file line #13: Error inflating class com.mapbox.mapboxsdk.views.MapView at android.view.LayoutInflater.createView(LayoutInflater.java:633) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743) at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) at android.view.LayoutInflater.inflate(LayoutInflater.java:504) at android.view.LayoutInflater.inflate(LayoutInflater.java:414) at com.example.exampleapp.FragmentMap.onCreateView(FragmentMap.java:133) at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613) at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570) at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) at android.support.v4.view.ViewPager.populate(ViewPager.java:1106) at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:552) at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:514) at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:495) at android.support.design.widget.TabLayout$ViewPagerOnTabSelectedListener.onTabSelected(TabLayout.java:1778) at android.support.design.widget.TabLayout.selectTab(TabLayout.java:871) at android.support.design.widget.TabLayout.selectTab(TabLayout.java:841) at android.support.design.widget.TabLayout$Tab.select(TabLayout.java:1115) at android.support.design.widget.TabLayout$1.onClick(TabLayout.java:665) at android.view.View.performClick(View.java:4785) at android.view.View$PerformClick.run(View.java:19884) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5343) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.newInstance(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:288) at android.view.LayoutInflater.createView(LayoutInflater.java:607) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743) at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) at android.view.LayoutInflater.inflate(LayoutInflater.java:504) at android.view.LayoutInflater.inflate(LayoutInflater.java:414) at com.example.exampleapp.FragmentMap.onCreateView(FragmentMap.java:133) at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613) at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570) at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) at android.support.v4.view.ViewPager.populate(ViewPager.java:1106) at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:552) at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:514) at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:495) at android.support.design.widget.TabLayout$ViewPagerOnTabSelectedListener.onTabSelected(TabLayout.java:1778) at android.support.design.widget.TabLayout.selectTab(TabLayout.java:871) at android.support.design.widget.TabLayout.selectTab(TabLayout.java:841) at android.support.design.widget.TabLayout$Tab.select(TabLayout.java:1115) at android.support.design.widget.TabLayout$1.onClick(TabLayout.java:665) at android.view.View.performClick(View.java:4785) at android.view.View$PerformClick.run(View.java:19884) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5343) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700) Caused by: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.exampleapp-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libmapbox-gl.so" at java.lang.Runtime.loadLibrary(Runtime.java:366) at java.lang.System.loadLibrary(System.java:988) at com.mapbox.mapboxsdk.views.NativeMapView.<clinit>(NativeMapView.java:42) at com.mapbox.mapboxsdk.views.MapView.initialize(MapView.java:680) at com.mapbox.mapboxsdk.views.MapView.<init>(MapView.java:621) at java.lang.reflect.Constructor.newInstance(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:288) at android.view.LayoutInflater.createView(LayoutInflater.java:607) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743) at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) at android.view.LayoutInflater.inflate(LayoutInflater.java:504) at android.view.LayoutInflater.inflate(LayoutInflater.java:414) at com.example.exampleapp.FragmentMap.onCreateView(FragmentMap.java:133) at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613) at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570) at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) at android.support.v4.view.ViewPager.populate(ViewPager.java:1106) at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:552) at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:514) at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:495) at android.support.design.widget.TabLayout$ViewPagerOnTabSelectedListener.onTabSelected(TabLayout.java:1778) at android.support.design.widget.TabLayout.selectTab(TabLayout.java:871) at android.support.design.widget.TabLayout.selectTab(TabLayout.java:841) at android.support.design.widget.TabLayout$Tab.select(TabLayout.java:1115) at android.support.design.widget.TabLayout$1.onClick(TabLayout.java:665) at android.view.View.performClick(View.java:4785) at android.view.View$PerformClick.run(View.java:19884) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5343) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700) 

App gradle:

 buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:1.3.0' } } apply plugin: 'com.android.application' apply plugin: 'com.google.gms.google-services' repositories { mavenCentral() jcenter() } android { compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { applicationId "com.example.exampleapp" minSdkVersion 19 targetSdkVersion 23 versionCode 1 versionName "1.0" multiDexEnabled true } useLibrary 'org.apache.http.legacy' buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:cardview-v7:23.1.1' compile 'com.android.support:design:23.1.1' compile 'com.google.android.exoplayer:exoplayer:r1.5.2' compile 'com.google.android.gms:play-services-auth:8.3.0' compile 'com.google.android.gms:play-services-maps:8.3.0' compile('com.mapbox.mapboxsdk:mapbox-android-sdk:2.3.0@aar') { transitive = true } compile files('libs/commons-lang3-3.3.2.jar') } 

Структура проекта:

Введите описание изображения здесь

Solutions Collecting From Web of "Mapbox Inflate View на фрагменте"

Эта библиотека выглядит в тяжелом состоянии развития и может иметь некоторые проблемы, о которых упоминается в GitHub, особенно при запуске версии 2.2.0.

Попробуйте изменить версию на новую стабильную:

 compile 'com.mapbox.mapboxsdk:mapbox-android-sdk:3.0.0' 

Вы говорите об инфляции, но смотрите на трассировку стека:

Вызвано: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader [DexPathList [[zip-файл] /data/app/com.example.exampleapp-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, / system / Lib]]] не удалось найти «libmapbox-gl.so» в java.lang.Runtime.loadLibrary (Runtime.java:366) в java.lang.System.loadLibrary (System.java:988) в com.mapbox .mapboxsdk.views.NativeMapView. (NativeMapView.java:42) в com.mapbox.mapboxsdk.views.MapView.initialize (MapView.java:680) в com.mapbox.mapboxsdk.views.MapView. (MapView.java:621 )

КСТАТИ:

первый

Вам нужно решить, следует ли раздувать просмотр каждый раз (локальная переменная) или повторно использовать его (глобальный)

пример:

 if(_view==null) _view = inflater.inflate(..); return _view; 

второй:

Не вызывайте действия или методы фрагмента, такие как onCreate onPause вручную (те, которые используются os для поддержания жизненного цикла)

в третьих:

Если вы используете viewpager и вложенные фрагменты, вам нужно создать адаптер с дочерним менеджером фрагментов

больше, больше:

Имейте в виду, что для установки некоторых данных и свойств в дочернем фрагменте фрагмент viewpager необходимо выложить

«Во-первых: я раздуваю его каждый раз, что обычно не является проблемой (мои вкладки работают с любым другим фрагментом, который я создал, в том числе с Картами Google, а не с Mapbox). Во-вторых: Да, вы вручную используете методы жизненного цикла активности. Для использования onCreate для раздувания представления. В-третьих: у меня есть адаптер, я просто не включил его здесь. Это не проблема, мои вкладки отлично работают с любым другим фрагментом, который я создал. Наконец: я не уверен, что вы «Я говорю, но мои фрагменты отлично работают на моих других вкладках.

Пожалуйста, сосредоточьтесь на проблеме … поставьте отображение Mapbox во фрагмент,> независимо от того, где этот фрагмент (tab pageviewer или нет) .. – TangoJLabs "

 /** * Called to do initial creation of a fragment. This is called after * {@link #onAttach(Activity)} and before * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}. * * <p>Note that this can be called while the fragment's activity is * still in the process of being created. As such, you can not rely * on things like the activity's content view hierarchy being initialized * at this point. If you want to do work once the activity itself is * created, see {@link #onActivityCreated(Bundle)}. * * @param savedInstanceState If the fragment is being re-created from * a previous saved state, this is the state. */ public void onCreate(@Nullable Bundle savedInstanceState) { mCalled = true; } 

Переместите это из onCreate фрагмента в onViewCreated (View, Bundle)

 mv = (MapView) fragmentLayout.findViewById(R.id.mapview); mv.onCreate(savedInstanceState); miniMap = (MapView) fragmentLayout.findViewById(R.id.mini_map); miniMap.onCreate(savedInstanceState); /** * Called immediately after {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} * has returned, but before any saved state has been restored in to the view. * This gives subclasses a chance to initialize themselves once * they know their view hierarchy has been completely created. The fragment's * view hierarchy is not however attached to its parent at this point. * @param view The View returned by {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}. * @param savedInstanceState If non-null, this fragment is being re-constructed * from a previous saved state as given here. */ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { } 

Последнее слово: файлы gradle

Я не знаю, содержит ли содержимое вашего файла как файлы градиента, так и только файл приложения, но эти строки не должны находиться в файле приложения gradle – это градиент верхнего уровня:

 buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:1.3.0' } } repositories { mavenCentral() jcenter() } 

И вы должны подумать о переходе на новейший плагин для Android-приложения, но я вижу, что вы используете gms-сервисы – поэтому u верхний файл градиента содержит другой плагин, а те, что указаны выше, опущены

У меня возникают проблемы с логикой ваших изменений. У меня нет onCreate, из которого я могу перемещать что-либо

 /** inflate fragment - this will create view */ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_map, container, false); } /** after view is created - set map view */ @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); if(view!=null) { MapView mv = (MapView) view.findViewById(R.id.mapview); mv.onCreate(savedInstanceState); } } 

Btw У меня больше проблем с остальными методами жизненного цикла – фрагмент мог или не мог сохранить состояние, поэтому простые методы жизненного цикла действия в методе фрагмента могли бы вызвать больше проблем 🙂

Я не использую и не знаю исходную реализацию MapView, поэтому я не могу сказать, как это реализовать, но я могу дать подсказку ua, чтобы проверить, привязан ли фрагмент к активности до того, как вы вызовете любой метод mapview

@ Ceph3us -1 все, что упоминается в этом, неверно, и ваша грамматика может быть улучшена. У меня нет ответа на этот вопрос, я здесь с тем же вопросом. 1-й корневой вид не должен быть полем, он должен быть раздутым при каждом вызове onCreateView, 2-й – это правильные вызовы, 3-й и остальные – вне темы и не полезны для объекта. – HaydenKai

@HaydenKai

  1. В первую очередь просьбы указать ИСТОЧНИКИ для обсуждения
  2. Почему у хотите воссоздать представление? цель ? Тратить ресурсы (например, ваше время на код и пользовательский CPU и MEM)? – там, где вы можете себе это позволить или вам нужен свежий, тогда это нормально, но в других случаях ВОЗВРАТ !!!
  3. Представление вообще не нужно накачивать, его можно создать, например, путем возврата нового LinearLayout (Context) или FrameLayout или любого другого сложного представления – это выбор разработчика для использования xml или java – я предпочитаю не использовать xml – Мне нравится чистый JAVA 🙂
  4. Поэтому в самом конце я могу сказать, что ваш -1 пуст для меня

Введите описание изображения здесь