Mapbox infla la vista en el fragmento

Tengo problemas para inflar un Mapbox MapView en un fragmento de Android. Cuando utilizo el mismo código en una actividad (aparte de las diferencias estándar entre una actividad y un fragmento), puedo obtener el MapView para cargar correctamente, pero no en el fragmento.

Mapbox también tiene una clase MapFragment aquí , pero no estoy seguro de cómo usar esto correctamente en un fragmento (el ejemplo sigue en una actividad); Con la API de Google Maps, puedo utilizar un MapView en un fragmento sin ningún problema.

La siguiente línea logcat de:

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

Se refiere a la línea Java:

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

Aquí está el código relevante para este problema junto con el registro:

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) 

Gradle aplicación:

 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') } 

Estructura del proyecto:

Introduzca aquí la descripción de la imagen

2 Solutions collect form web for “Mapbox infla la vista en el fragmento”

Esta biblioteca se ve en el estado de desarrollo pesado y podría tener algunos problemas, que se mencionan en GitHub, especialmente cuando se ejecuta la versión 2.2.0.

Pruebe a cambiar la versión a la más reciente estable:

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

Usted está diciendo sobre la inflación pero mira el rastro de la pila:

Causado por: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader [DexPathList [[archivo zip "/data/app/com.example.exampleapp-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, / system / Lib]]] no pudo encontrar "libmapbox-gl.so" en java.lang.Runtime.loadLibrary (Runtime.java:366) en java.lang.System.loadLibrary (System.java:988) en com.mapbox .mapboxsdk.views.NativeMapView. (NativeMapView.java:42) en com.mapbox.mapboxsdk.views.MapView.initialize (MapView.java:680) en com.mapbox.mapboxsdk.views.MapView. (MapView.java:621 )

Por cierto

primero

U necesidad de decidir si u inflar ver cada vez {variable local) u u reutilizarlo (global)

ejemplo:

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

segundo:

No llame a actividades o fragmentos de métodos como onCreate onPause manualmente (los utilizados por os para mantener el ciclo de vida)

tercero:

Si u uso viewpager y fragmentos anidados u necesidad de crear un adaptador con el administrador de fragmentos de niño

mas, mas:

Tenga en cuenta que para establecer algunos datos y propiedades en el fragmento de fragmento de fragmento de niño debe ser establecido

"Primero: lo estoy inflando cada vez, lo cual no suele ser un problema (mis pestañas funcionan con cualquier otro fragmento que he creado, incluyendo Google Maps, no Mapbox) Segundo: Sí, llamas manualmente los métodos del ciclo de vida de la actividad. Para usar onCreate para inflar una vista.Tercero: Tengo un adaptador, no lo incluí aquí.Ése no es el problema, mis pestañas funcionan bien con cualquier otro fragmento que he creado.Por último: No estoy seguro de lo que usted 'Re diciendo, pero mis fragmentos funcionan bien en mis otras pestañas.

Por favor, centrar la atención en el problema en cuestión … poner una vista Mapbox en un fragmento,> independientemente de dónde está ese fragmento (tab pageviewer o no) .. – 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; } 

Mover esto de onCreate del fragmento a 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) { } 

Última palabra: gradle files

No sé si el contenido del archivo contiene archivos de gradle o sólo archivo de aplicación, pero las líneas no deberían estar en el archivo de gradle de la aplicación – son gradle de nivel superior:

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

Y u debe considerar para pasar a la más reciente aplicación de plugin de Android – pero veo que está utilizando los servicios de gms – por lo que u top gradle archivo contiene otro complemento y los anteriores se omite

Estoy teniendo problemas siguiendo la lógica de tus ediciones. No tengo un onCreate del cual puedo mover nada

 /** 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 i tienen más preocupaciones sobre el resto de los métodos de ciclo de vida – fragmento podría o no mantener el estado tan simple poner los métodos de ciclo de vida de la actividad en el método de fragmento podría producir más problemas 🙂

No utilizo y conozco la implementación de origen de MapView así que no puedo decirle a u cómo implementar esto, pero puedo dar ua pista para comprobar si el fragmento se adjunta a la actividad antes de llamar u cualquier método mapview

@ Ceph3us -1 todo lo mencionado en esto es incorrecto, y su gramática se puede mejorar. No tengo una respuesta a esto, estoy aquí con la misma pregunta. 1ra opinión de la raíz no debe ser un campo, debe ser inflada en cada llamada a onCreateView, 2das éstas son llamadas apropiadas, 3ro y el resto está fuera de tema y no útil al tema. – HaydenKai

@ HaydenKai

  1. En primer lugar los motivos especifican las FUENTES para usted las deliberaciones
  2. ¿Por qué quieres recrear la vista? propósito ? Para desperdiciar recursos (como su tiempo para codificar y CPU de usuario y MEM)? – allí donde u puede permitirse o necesita una fresca, entonces su bien, pero en otros casos REUSE !!!
  3. La vista no necesita ser inflada en absoluto, se puede crear normalmente, por ejemplo, regresar nuevo LinearLayout (Contexto) o FrameLayout o cualquier otra vista compleja – esta es una opción de desarrollador para usar xml o java – prefiero no usar xml – Me gusta puro java
  4. Así que al final puedo decir que tu -1 es una vacía para mí ella

Introduzca aquí la descripción de la imagen

  • Android.view.inflateexception binario archivo xml línea # 1 error inflar clase android.widget.relativeLayout
  • Android: asignar un valor constante a un elemento xml
  • ¿Por qué no es posible usar mayúsculas en los recursos de nombres en android?
  • Recursos de cadena de XML vs cadenas constantes de Java?
  • Spinner estilo de color en Android
  • Cómo agregar varios marcos en xml
  • Cómo centrar drawableTop y texto verticalmente en el botón en Android?
  • Super.onCreateView en Fragmentos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.