Android MapBox 充气错误。找不到类 MapView

Posted

技术标签:

【中文标题】Android MapBox 充气错误。找不到类 MapView【英文标题】:Android MapBox inflating error. Didn't find class MapView 【发布时间】:2016-07-15 18:57:18 【问题描述】:

当我使用 MapBox 库启动 android 应用程序时出现异常:

"android.view.InflateException:二进制 XML 文件第 9 行:错误 膨胀类 com.mapbox.mapboxsdk.views.MapView"

“原因”字段包含以下文本:

java.lang.ClassNotFoundException: 找不到类 路径上的“com.mapbox.mapboxsdk.views.MapView”:DexPathList [[zip 文件 "/data/app/com.example.my.mymapbox-2/base.apk"],nativeLibraryDirectories=[/data/app/com.example.my.mymapbox-2/lib/arm, /vendor/lib, /system/lib]]

请帮忙

这是我的代码:

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_
android:layout_
tools:context=".MainActivity">

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

【问题讨论】:

您是否尝试过完全干净和 gradle 构建您的项目? Clean & gradle build 没有帮助。 另一个你应该记住的想法是无效的Token也会导致inflating错误。 【参考方案1】:

我也遇到过这个问题,但是当将此库添加到我的dependencies

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

给出这个例外

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

即使我不使用导航!然后我意识到我必须在 setContentView 之前初始化 Mapbox

所以就这样向上移动

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

我的问题解决了

【讨论】:

在 setContentView 之前初始化 Mapbox。正是 只要在你的Application类的onCreate()方法Mapbox.getInstance(this, YOUR_MAPBOX_KEY);中写下这一行@【参考方案2】:

MapView 的 XML 必须是 com.mapbox.mapboxsdk.maps.MapView 而不是 com.mapbox.mapboxsdk.views.MapView

在使用最新的 Mapbox Android SDK 版本时可能会有所帮助的其他事项是:

    implementation ('com.mapbox.mapboxsdk:mapbox-android-sdk:8.4.0@aar')
        transitive=true
    

确保包含所有必需的权限以及遥测服务:

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

为了在 8.4.0 中控制 MapView,有一个名为 getMapAsync 的新方法会在地图准备就绪时进行侦听。完成后,您可以添加标记、更改相机位置等。

这是请求权限的方法:

Mapbox.getInstance(this, ACCESS_TOKEN);

您的onCreate 方法应该如下所示:

    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!

            

    ... 

最后,确保在活动生命周期中包含所有 mapView 方法。它看起来像这样:

    // 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);
    

【讨论】:

是的!它有帮助,谢谢:) 现在我有另一个例外:D 我用一些有用的步骤编辑了我的答案。如果您在发生异常的地方发布您的 logcat,我可以进一步帮助您。 也许我应该创建其他主题。下一条异常消息是:“/libEGL: validate_display:255 error 3008 (EGL_BAD_DISPLAY)” 这是 logcat pastebin.com/jtYivuzV 最好为这个问题创建一个新问题。确保包括您的 logcat 和您尝试使用的设备,以及任何其他相关信息,我将能够提供帮助。如果我解决了您在上述问题中提到的问题,请将其标记为已回答,以便其他有相同问题的人可以快速找到答案。 一些报告。当我将“com.mapbox.mapboxsdk.views.MapView”更改为“com.mapbox.mapboxsdk.maps.MapView”时。 “InflateException”已经消失,我得到 EGL_BAD_DISPLAY 异常。在我添加“遥测服务”权限(已经添加了其他权限,抱歉英语不好)并将 mapView 方法添加到活动生命周期后,EGL_BAD_DISPLAY 异常也消失了。

以上是关于Android MapBox 充气错误。找不到类 MapView的主要内容,如果未能解决你的问题,请参考以下文章

找不到 com.mapbox.navigator:mapbox-navigation-native:7.0.0

找不到类“ android.view.View?

是啥导致“错误:找不到属性 mapbox_styleUrl”?

带有 Angular 6 的 Mapbox。“找不到地图容器”错误

Mapbox:我想使用 Locationengine 来获取用户的当前位置,但它给我一个错误

Android 地图错误“找不到类 'android.app.AppOpsManager'”