【问题标题】:Error android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.google.android.gms.maps.MapFragment错误 android.support.v4.app.Fragment$InstantiationException:无法实例化片段 com.google.android.gms.maps.MapFragment
【发布时间】:2015-07-02 14:06:24
【问题描述】:

我正在关注使用 google maps api v2 的教程。我遇到了一个错误 错误日志是

05-15 00:08:18.415: E/AndroidRuntime(4547): FATAL EXCEPTION: main
05-15 00:08:18.415: E/AndroidRuntime(4547): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.rtesh.onemore/org.rtesh.onemore.MainActivity}: android.view.InflateException: Binary XML file line #7: Error inflating class fragment
05-15 00:08:18.415: E/AndroidRuntime(4547):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1830)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1851)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at android.app.ActivityThread.access$1500(ActivityThread.java:132)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1038)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at android.os.Looper.loop(Looper.java:150)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at android.app.ActivityThread.main(ActivityThread.java:4277)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at java.lang.reflect.Method.invokeNative(Native Method)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at java.lang.reflect.Method.invoke(Method.java:507)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at dalvik.system.NativeStart.main(Native Method)
05-15 00:08:18.415: E/AndroidRuntime(4547): Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class fragment
05-15 00:08:18.415: E/AndroidRuntime(4547):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:587)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:623)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at android.view.LayoutInflater.inflate(LayoutInflater.java:408)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:250)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at android.app.Activity.setContentView(Activity.java:1712)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at org.rtesh.onemore.MainActivity.onCreate(MainActivity.java:27)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1072)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1794)
05-15 00:08:18.415: E/AndroidRuntime(4547):     ... 11 more
05-15 00:08:18.415: E/AndroidRuntime(4547): Caused by: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.google.android.gms.maps.MapFragment: make sure class name exists, is public, and has an empty constructor that is public
05-15 00:08:18.415: E/AndroidRuntime(4547):     at android.support.v4.app.Fragment.instantiate(Fragment.java:395)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at android.support.v4.app.Fragment.instantiate(Fragment.java:363)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:264)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)
05-15 00:08:18.415: E/AndroidRuntime(4547):     ... 20 more
05-15 00:08:18.415: E/AndroidRuntime(4547): Caused by: java.lang.ClassNotFoundException: com.google.android.gms.maps.MapFragment in loader dalvik.system.PathClassLoader[/data/app/org.rtesh.onemore-1.apk]
05-15 00:08:18.415: E/AndroidRuntime(4547):     at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
05-15 00:08:18.415: E/AndroidRuntime(4547):     at android.support.v4.app.Fragment.instantiate(Fragment.java:385)
05-15 00:08:18.415: E/AndroidRuntime(4547):     ... 23 more

我的 MainActivity 类是

@SuppressLint("NewApi")
public class MainActivity extends FragmentActivity {
  static final LatLng HAMBURG = new LatLng(53.558, 9.927);
  static final LatLng KIEL = new LatLng(53.551, 9.993);
  private GoogleMap map;

@SuppressLint("NewApi")
@Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map))
        .getMap();

    if (map!=null){
      Marker hamburg = map.addMarker(new MarkerOptions().position(HAMBURG)
          .title("Hamburg"));
      Marker kiel = map.addMarker(new MarkerOptions()
          .position(KIEL)
          .title("Kiel")
          .snippet("Kiel is cool")
          .icon(BitmapDescriptorFactory
              .fromResource(R.drawable.ic_launcher)));
    }

  } 

}

而activity_main.xml 是

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <fragment
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.MapFragment" />

</RelativeLayout> 

我在 maifest 类中授予了适当的权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.rtesh.onemore"
    android:versionCode="1"
    android:versionName="1.0" >
<permission
        android:name="org.rtesh.android.locationapi.maps.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" />
    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />
<uses-permission android:name="com.org.rtesh.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" />


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

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="org.rtesh.onemore.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="mykey" />

    </application>

</manifest>

我引用了 google play 服务库为什么我会遇到这个错误?请帮忙 请指出谷歌地图版本1和2之间的主要区别!!

【问题讨论】:

    标签: android android-manifest android-maps-v2


    【解决方案1】:

    尝试将您的布局替换为:

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

    11岁以下的API需要使用SupportMapFragment

    在您的 MainActivity 中(或在您想要放置 v2 地图的每个 Activity 中)您必须扩展 FragmentActivity 或 Activity,您想要使用 SupportMapFragment 或只是 MapFragment。仅当您面向 API 12 及更高版本时才使用 MapFragment 类。否则,使用 SupportMapFragment。这是一个微妙的差异,但它会产生错误。

    编辑:

    请更改 FragmentActivity 中的代码:

    map = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map))
            .getMap();
    

    了解这个概念。由于您的目标是不支持片段的较低 android 版本,因此您需要使用支持库来处理您的片段。因此,无论您在哪里使用片段,请确保您从 support 库中导入片段。

    【讨论】:

    • 使用 SupportMapFragment op 还需要添加支持库
    • 他需要添加支持库android-support-v4.jar。我不是在说使用它
    • 在 sdk 管理器中我下载了 google play services 然后引用了这个库,但我仍然面临错误
    • @RiteshMehandiratta 按照答案中的建议进行更改。还可以通过下载相同的developer.android.com/tools/extras/… 添加支持库
    • 是的,但假设他已经添加了它(如果我们看到标题),否则他会在没有实际添加的情况下引用支持库时出现编译时错误。但是他遇到了运行时异常。所以我相信他一定已经添加了库
    【解决方案2】:

    首先,与本文的其他回复者一样,您应该将最低 Android SDK 级别更改为至少 11

    android:minSdkVersion="11"
    

    这是我昨天制作的一个工作示例。

    activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <fragment
    android:name="com.google.android.gms.maps.SupportMapFragment"
    xmlns:map="http://schemas.android.com/apk/res-auto"
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    map:cameraTargetLat="33.41662287712097"
    map:cameraTargetLng="35.21843892856462"
    map:cameraZoom="4"/>
    
    </LinearLayout>In MainActivity.java onCreate()
    

    在 MainActivity.java 中的 onCreate()

    public class MainActivity extends FragmentActivity  {
    
    private GoogleMap mMap;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    GoogleMap mMap = mapFragment.getMap();
    
    mMap.addMarker(new MarkerOptions()
    .position(new LatLng(35.21843892856462, 33.41662287712097))
    .title("My Office"));
    
    }
    

    要查看我的代码结果屏幕截图,请参阅我在这篇文章中的回答。哈哈! Google Map V2 not working for me . Any sample?

    【讨论】:

    • 你能解释一下,为什么我们需要将 minSdkVersion 设置为 11 吗?
    • 是的,但根据 Mark 的评论,我理解的事实是 android 支持库是专门为支持旧 android 版本不可用的功能而设计的。
    • 而且这个家伙已经在使用支持库,所以他不必增加他的 minsdk req。他只需要从 support lib n 而不是 android lib 导入类
    【解决方案3】:

    您的最小 sdk 为 8。您需要为 12 以下的 api 版本添加支持库

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

    所以为了向后兼容,你需要添加支持库

    android:name="com.google.android.gms.maps.SupportMapFragment "
    

    因为你没有添加支持库,所以你得到了 classcastexception

    要添加支持库,请查看下面的链接

    http://developer.android.com/tools/extras/support-library.html

    用于下载支持片段

    http://developer.android.com/tools/extras/support-library.html#Downloading

    更多信息请查看链接

    https://developers.google.com/maps/documentation/android/reference/com/google/android/gms/maps/MapFragment

    检查标题开发者指南正上方的行。

    有关地图 api v2 的更多信息,请查看文档

    https://developers.google.com/maps/documentation/android/

    【讨论】:

      【解决方案4】:

      公共类 SearchOffer 扩展 FragmentActivity {

      GoogleMap gmpSearchOfferMap;
      Context context;
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
      
          try {
              setContentView(R.layout.search_offers);
      
              if (gmpSearchOfferMap == null) {
                  gmpSearchOfferMap = ((SupportMapFragment) getSupportFragmentManager()
                          .findFragmentById(R.id.gmpOfferMap)).getMap();
              }
      
              if (gmpSearchOfferMap != null) {
                  gmpSearchOfferMap.setMyLocationEnabled(true);
                  gmpSearchOfferMap.getUiSettings().setMyLocationButtonEnabled(
                          true);
                  gmpSearchOfferMap.getUiSettings().setZoomControlsEnabled(true);
                  gmpSearchOfferMap.getUiSettings().setZoomGesturesEnabled(true);
              }
          } catch (Exception e) {
              e.printStackTrace();
          }
      
      }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-21
        • 2013-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多