BadEugene BadEugene - 2 months ago 11
Android Question

Android MapBox inflating error. Didn't find class MapView

When I launch android app with MapBox library I get exception:


"android.view.InflateException: Binary XML file line #9: Error
inflating class com.mapbox.mapboxsdk.views.MapView"


Field "cause" contains this text:


java.lang.ClassNotFoundException: Didn't find class
"com.mapbox.mapboxsdk.views.MapView" on path: DexPathList[[zip file
"/data/app/com.example.my.mymapbox-2/base.apk"],nativeLibraryDirectories=[/data/app/com.example.my.mymapbox-2/lib/arm,
/vendor/lib, /system/lib]]


Help please

This is my code:

build.gradle

apply plugin: 'com.android.application'

android {
compileSdkVersion 23
buildToolsVersion "23.0.2"

defaultConfig {
applicationId "com.example.my.mymapbox"
minSdkVersion 19
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile ('com.mapbox.mapboxsdk:mapbox-android-sdk:4.0.0-beta.2@aar'){
transitive=true
}
}


MainActivity.java

package com.example.my.mymapbox;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}


}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:mapbox="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<com.mapbox.mapboxsdk.views.MapView
android:id="@+id/mapview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
mapbox:access_token="@string/accessToken"/>
<!-- note the access token string created in the previous step -->
</RelativeLayout>

Answer

Your XML for the MapView needs to be com.mapbox.mapboxsdk.maps.MapView not com.mapbox.mapboxsdk.views.MapView

Other things that might help when using the latest Mapbox Android SDK version which is:

compile ('com.mapbox.mapboxsdk:mapbox-android-sdk:4.0.0-rc.1@aar'){
    transitive=true
}

make sure to include all the required permissions as well as Telemetry service:

<service android:name="com.mapbox.mapboxsdk.telemetry.TelemetryService" />

To control the MapView in 4.0.0 there is a new method called getMapAsync which listens for when the map is ready. Once it is, you can add markers, change the camera position, etc. So your onCreate will look something like so:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mapView = (MapView) findViewById(R.id.mapview);
    mapView.onCreate(savedInstanceState);

    mapView.getMapAsync(new OnMapReadyCallback() {
        @Override
        public void onMapReady(MapboxMap mapboxMap) {

            // add markers, change camera position, etc. here!

        }

... 

Lastly, make sure you include all the mapView methods within your activities lifecycle. It will look like this:

// Activity lifecycle calls
@Override
protected void onStart() {
    super.onStart();
    mapView.onStart();
}

@Override
public void onResume() {
    super.onResume();
    mapView.onResume();
}

@Override
public void onPause() {
    super.onPause();
    mapView.onPause();
}

@Override
protected void onStop() {
    super.onStop();
    mapView.onStop();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    mapView.onDestroy();
}

@Override
public void onLowMemory() {
    super.onLowMemory();
    mapView.onLowMemory();
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    mapView.onSaveInstanceState(outState);
}

Hope this helps!