Google地图V2 - 错误膨胀类片段。

36

我正在尝试开发Android应用程序。我目前正在使用Eclipse(我不记得版本是多少,反正就是最新的)。我遇到了一个问题,就是无论怎么做都似乎无法搞清楚自己错在哪里。我尝试使用Google Maps V2 API,浏览了好几篇文档并尝试了好几种技术,但结果都是同样的错误:

Android.view.Inflate Exception: Binary XML file line #2: Error inflating class fragment
我已经连续两天把自己的脸都磨在键盘上,试图弄清楚我在这里做错了什么。
我所做的事情:
  1. 从空白活动开始。
  2. 项目 -> 属性 -> Android -> 项目构建目标是Google APIs - 4.2 - API 17 - 我已经尝试过每一个其他选项(只要高于3.0版本,找到它的文档)。
  3. 将google-play-services_lib添加到我的Package Explorer中。我指出了google-play-services_lib确实是一个库
  4. 项目 -> 属性 -> Android -> 库 -> 添加 -> 然后我选择了google-play-services_lib的位置。
  5. android-support-v4.jar作为我的项目依赖项。
我尝试了许多与我的问题类似的答案,但是都没有成功。 :( 我通常可以想出这些事情,但也许我只是太过负荷了。
在eclipse中,我的包资源管理器树如下所示:
  1. google-play-services_lib
  2. Svma
以下是代码:
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="com.google.android.gms.maps.SupportMapFragment"/>

清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.testing.svma"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="17"
        android:targetSdkVersion="17" />

    <permission
        android:name="com.testing.svma.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" />

    <uses-permission android:name="com.testing.svma.permission.MAPS_RECEIVE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.testing.svma.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="SHA1_Generated_KEY_HERE" />
    </application>

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />
</manifest>

MainActivity.java

package com.testing.svma;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


    }
}

参考文献

  1. 我使用“Error inflating class fragment” with google map来尝试修复我的问题。

  2. 我参考了此Google地图快速入门指南创建我的项目。

  3. 我最初从Google Maps Android V2 Api介绍的示例代码开始

  4. 一堆SO问题。

所以,SO社区,我做错了什么?为什么我无法掌握这个简单的概念。

提前致谢。


我正在做同样的事情。我的代码可以工作,并且看起来与你的完全相同。也许发一下堆栈跟踪的其余部分?是否有第二个“Caused by:”吗? - Adam
16个回答

32

我知道这个帖子可能已经死掉了,但以防万一有人偶然发现并且遇到相同的问题 - 你的清单文件(manifest)可能缺少以下元信息:

<meta-data
    android:name="com.google.android.gms.version"
    android:value="@integer/google_play_services_version" />

将其声明在<application>元素内,你的代码应该可以工作。我也曾遇到同样的问题,在遵循 YouTube 教程时跳过了这一步骤,只有当仔细阅读原始的 Google 教程时我才注意到缺少的代码。

无论如何,希望这能帮助到某个人。


1
重要的是,确保在应用程序元素内添加此元标记! - Garbit

23

我有相同的代码/相同的问题!尝试在布局中的“fragment”中添加android:name="com.testing.svma.MainActivity"!这对我解决了问题。

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="com.google.android.gms.maps.SupportMapFragment"
    android:name="com.testing.svma.MainActivity"/>

我之前也遇到了类似的问题,但是我使用的是MapFragment。我复制并粘贴了你的XML代码,并将“android:name”行更改为与我的项目匹配。它奏效了!我还不得不进行了一些小的代码更改。我必须在之前的代码上添加这个 ((SupportMapFragment)(this.getSupportFragmentManager().findFragmentById(R.id.map))).getMap(); 。我不知道为什么这样做可以解决问题,因为两天前我的代码还能正常工作... 我甚至没有推送新的更新,只是重新打开应用程序就出现了所有这些错误。 - JustinDanielson
我想这取决于API级别。我被困在实现API 8上,这对我没有任何改变。我仍在寻找解决方案。 - JavaCoderEx
1
这让我很开心。但是为什么改名字就解决了问题? - Skoua

6
我遇到了相同的问题,通过修改清单文件来解决。这是我的清单文件。
 <?xml version="1.0" encoding="utf-8"?>
        <manifest xmlns:android="http://schemas.android.com/apk/res/android"
            package="example.gps"
            android:versionCode="1"
            android:versionName="1.0" >

        <permission 
               android:name="example.gps.permission.MAPS_RECEIVE" 
               android:protectionLevel="signature"></permission>
      <!-- Copied from Google Maps Library/AndroidManifest.xml. -->
         <uses-sdk
           android:minSdkVersion="9"
           android:targetSdkVersion="17"/>
         <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
         <uses-permission android:name="android.permission.INTERNET"/>
         <uses-permission      android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
      <!-- External storage for caching. -->
         <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
      <!-- My Location -->
         <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
         <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
      <!-- Maps API needs OpenGL ES 2.0. -->
         <uses-feature
            android:glEsVersion="0x00020000"
            android:required="true"/>
      <!-- End of copy. -->

        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme"
            android:hardwareAccelerated="true" >
            <meta-data
                android:name="com.google.android.maps.v2.API_KEY"
                android:value="<YOUR VALUE>"/>
            <meta-data
                android:name="com.google.android.gms.version"
                android:value="@integer/google_play_services_version" />
            <activity
                android:name="example.gps.MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />

                     <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>

    </manifest>

而 XML 文件则是:

 <?xml version="1.0" encoding="utf-8"?>
    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.SupportMapFragment"
    />

这个Java类是:

   public class MainActivity extends FragmentActivity
        {
           @Override
           protected void onCreate(Bundle savedInstanceState) {
               super.onCreate(savedInstanceState);
               setContentView(R.layout.activity_main);
           }
        }

那解决了我的问题。

4
你应该添加一些描述来说明你所做的更改,以使其运行。尽管发布的代码可能会帮助某人,但你应该明确代码的作用是什么。 - Joel

3
尝试在项目中添加 Google Play 服务库的引用。如果您使用的是 Eclipse,您需要前往项目->属性->Android并且 添加 Google Play 服务库项目。
或者,您可以手动修改 project.properties 文件。尝试添加对 Google Play 服务库的引用。所以我的 project.properties 文件看起来像这样:
# Project target.
target=android-17
android.library.reference.1=../../../android-sdks/extras/google/google_play_services/libproject/google-play-services_lib

在您的情况下,Google Play服务库的路径可能不同。
我尝试导入您的代码,结果也发生了崩溃。当我修改属性文件后,我成功运行了地图。

3
我花了很多时间尝试解决这个问题,经过大量的阅读和尝试,我通过更改

public class MainActivity extends FragmentActivity

public class MainActivity extends android.support.v4.app.FragmentActivity

解决了这个问题。希望这可以帮助您。


2

我曾经尝试了以上所有答案,持续了几天,最终这个方法起作用:

项目 -> 属性 -> Android -> 项目构建目标

将项目构建目标更改为Android 4.3(API 18)并点击应用

然后在清单文件中手动更改了最小和目标SDK版本:

<uses-sdk
    android:minSdkVersion="18"
    android:targetSdkVersion="18" />

现在,target=android-18与project.properties文件中的匹配成功(这是我们首先进行的项目构建目标更改所导致的)。

我还尝试了android:minSdkVersion="11",它可以工作,因此targetSdkVersion是重要的部分。

希望这能对某人有所帮助!


2

我曾经遇到过同样的问题,但是我错误地只添加了以下两个标签中的一个。

实际错误信息非常令人误解,因为你可能会认为这是某种API级别的UI问题。

        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="<YOUR VALUE>"/>
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
请注意,您还缺少这两个中的其中一个。

2

经常问题出现在Manifest.xml文件中,请确保您编写正确的权限,例如:

    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.zako.android.locationapi.maps"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="17"
        android:targetSdkVersion="17" />

    <permission
        android:name="com.zako.android.locationapi.maps.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" />

    <!-- Required OpenGL ES 2.0. for Maps V2 -->
    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <!-- Requires OpenGL ES version 2 -->
    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="com.zako.android.locationapi.maps.permission.MAPS_RECEIVE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.zako.android.locationapi.maps.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="......" />
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
    </application>

</manifest>

`

不要忘记 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />

1

在我的情况下,同时使用元数据引用解决了这个问题:

<meta-data
    android:name="com.google.android.gms.version"
    android:value="@integer/google_play_services_version" />
<meta-data
    android:name="com.google.android.maps.v2.API_KEY"
    android:value="yourAPIkeyFromGoogleAPIConsole" />

1

只需在onDestroy()中包含以下代码行。

SupportMapFragment mapFragment = ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map_location_sharing));

if(mapFragment != null) {
    FragmentManager fM = getFragmentManager();
    fM.beginTransaction().remove(mapFragment).commit();

它对我有效,希望对你也有效。谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接