Android MapBox inflating error. Didn't find class MapView

落花浮王杯 提交于 2020-07-09 06:45:07

问题


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>

回答1:


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:

    implementation ('com.mapbox.mapboxsdk:mapbox-android-sdk:8.4.0@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 8.4.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.

This is how to ask for the permission:

Mapbox.getInstance(this, ACCESS_TOKEN);

Your onCreate method should look something like this:

    String ACCESS_TOKEN = "ACCESS_TOKEN_HERE"

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Be sure to call this setContentView
        Mapbox.getInstance(this, ACCESS_TOKEN);

        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 methods
    @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);
    }



回答2:


I also faced this problem but when add this library to my dependencies

implementation 'com.mapbox.mapboxsdk:mapbox-android-navigation-ui:0.23.0'

Give this exeptions

Caused by: android.view.InflateException: Binary XML file line #0: Error inflating class com.mapbox.mapboxsdk.maps.MapView

Even if i do not use navigation!! Then i realize i must initialize Mapbox before setContentView

So just move up like this

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //first initialize Mapbox
    Mapbox.getInstance(this, YOUR_MAPBOX_KEY);
    //then 
    setContentView(R.layout.activity_main);
}

And my problem solved



来源:https://stackoverflow.com/questions/36263653/android-mapbox-inflating-error-didnt-find-class-mapview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!