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
是啥导致“错误:找不到属性 mapbox_styleUrl”?
带有 Angular 6 的 Mapbox。“找不到地图容器”错误