谷歌地图V2 - 错误膨胀类片段

时间:2013-02-06 22:24:46

标签: android google-maps-android-api-2

我正在尝试我的手和Android应用程序开发。我目前正在使用Eclipse(我不记得版本,无论最新版本是什么)。我越过了一座桥,在那里我似乎无法理解我做错了什么。我正在尝试使用Google Maps V2 API。我已经浏览了几个文档并尝试了几种技术,所有这些都导致了同样的错误:

Android.view.Inflate Exception: Binary XML file line #2: Error inflating class fragment

我一直在把钥匙砸到钥匙上2天,试图抓住我在这里做错了什么。

我做过的事情:

  1. 开始一项空白活动。
  2. 项目 - >属性 - > Android - > 项目构建目标是Google API - 4.2 - API 17 - 我也尝试了每个其他选项(只要上面的版本3.0,发现它已记录
  3. 在我的Package Explorer中添加了google-play-services_lib。我表示google-play-services_lib确实是a library
  4. 项目 - >属性 - > Android - >图书馆 - >添加 - >我选择google-play-services_lib的位置。
  5. 包含android-support-v4.jar作为我项目的依赖项。
  6. 我从类似于我的问题中尝试了很多不同的答案,但无济于事。 :( 我通常可以解决这些问题,但也许我太过分了。

    eclipse中的我的包浏览器树看起来像

    1. 谷歌播放-services_lib
    2. Svma
    3. 以下是代码:>

      activity_main.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"/>
      

      清单

      <?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. 我引用了This google maps quick start guide来创建我的项目。

      3. 我最初是以the sample code from the Introduction to the Google Maps Android V2 Api

      4. 开始的
      5. 一大堆SO问题。

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

        提前谢谢。

15 个答案:

答案 0 :(得分:31)

我知道这可能是一个死线程,但万一有人偶然发现这里遇到了同样的问题 - 你的清单可能缺少以下元信息:

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

<application>元素中声明它,您的代码应该有效。我在跳过这一步的youtube教程之后遇到了同样的问题,只有仔细阅读原始的Google教程,我才注意到丢失的代码。

无论如何,希望这有助于某人。

答案 1 :(得分:23)

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

<?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"/>

答案 2 :(得分: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);
           }
        }

这解决了我的问题

答案 3 :(得分:3)

尝试将google-play-services库引用添加到您的项目中。如果您使用的是Eclipse,则需要转到Project->Properties->AndroidAdd google-play-services库项目。

可替换地,

您可以手动修改project.properties文件。 尝试添加对google_play_services库的引用。所以我的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-services lib的路径可能不同

我尝试导入你的代码,它也崩溃了。当我修改属性文件时 - 我已经运行了地图

答案 4 :(得分:2)

我花了很多时间试图解决这个问题,经过多次阅读和尝试,我通过改变

来解决

public class MainActivity extends FragmentActivity

这个

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

我希望这可以帮到你

答案 5 :(得分:2)

在几天的时间内尝试了所有上述答案,然后最终确实有效:

项目 - &gt;属性 - &gt; Android - &gt;项目构建目标

将项目构建目标更改为android 4.3(API 18)并单击“应用”

在清单中,我然后手动更改了min和target sdk版本:

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

现在匹配project.properties文件中的target=android-18(由我们先做的项目构建目标更改产生)

我也尝试了android:minSdkVersion="11",因此targetSdkVersion非常重要。

希望这有助于某人!

答案 6 :(得分: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" />

答案 7 :(得分:1)

我遇到了类似的错误,我认为它来自于这一点:当我添加Google Play服务API时,我不会将其复制到我的工作区中,而是使用原始版本!!!

注意:您应该引用复制到源树的库的副本 - 您不应该从Android SDK目录引用该库。

检查这一点。

答案 8 :(得分:1)

我有类似的问题,我通过右击project->tools>add support library解决了... 和setup library

我希望这可以帮到你

答案 9 :(得分:1)

只需在onDestroy()

上添加以下代码行即可
SupportMapFragment mapFragment = ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map_location_sharing));

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

它对我有用。也非常适合你。感谢

答案 10 :(得分:1)

我也有这个错误,这是由于外部允许。它没有任何意义,但我添加了这个权限,从那时起一切正常。

答案 11 :(得分:1)

我遇到了同样的问题,我错误地只添加了以下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" />

请注意,您也缺少其中一个

答案 12 :(得分:1)

在一些android 6.0手机中这个例外是bug 如果无法解决XML原因

android:hardwareAccelerated="true" adding in activity tag

然后它是android中的活动bug https://issuetracker.google.com/issues/35827842

这可以通过添加

来解决
{{1}}

答案 13 :(得分:0)

使用两个元数据引用解决了我的问题:

<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" />

答案 14 :(得分:0)

我只是添加了API密钥以实现清单,并且对它有所帮助