web-dev-qa-db-ja.com

グーグルマップによる「クラスフラグメントの膨張エラー」

Google Mapを使ってサンプルプロジェクトを作ってみましたが、できませんでした。お願い助けて!

テストデバイス:Android 4.0.4


エラーメッセージ :

12-29 23:45:32.605: E/AndroidRuntime(9437): FATAL EXCEPTION: main
12-29 23:45:32.605: E/AndroidRuntime(9437):
Java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.example.test_googlemap/com.example.test_googlemap.MainActivity}:
Android.view.InflateException: Binary XML file line #2: Error
inflating class fragment 12-29 23:45:32.605: E/AndroidRuntime(9437):
Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1968)
12-29 23:45:32.605: E/AndroidRuntime(9437):     at
Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:1993)
12-29 23:45:32.605: E/AndroidRuntime(9437):     at
Android.app.ActivityThread.access$600(ActivityThread.Java:127) 12-29
23:45:32.605: E/AndroidRuntime(9437):   at
Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1159)
12-29 23:45:32.605: E/AndroidRuntime(9437):     at
Android.os.Handler.dispatchMessage(Handler.Java:99) 12-29
23:45:32.605: E/AndroidRuntime(9437):   at
Android.os.Looper.loop(Looper.Java:137) 12-29 23:45:32.605:
E/AndroidRuntime(9437):     at
Android.app.ActivityThread.main(ActivityThread.Java:4507) 12-29
23:45:32.605: E/AndroidRuntime(9437):   at
Java.lang.reflect.Method.invokeNative(Native Method) 12-29
23:45:32.605: E/AndroidRuntime(9437):   at
Java.lang.reflect.Method.invoke(Method.Java:511) 12-29 23:45:32.605:
E/AndroidRuntime(9437):     at
com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:790)
12-29 23:45:32.605: E/AndroidRuntime(9437):     at
com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:557) 12-29
23:45:32.605: E/AndroidRuntime(9437):   at
dalvik.system.NativeStart.main(Native Method) 12-29 23:45:32.605:
E/AndroidRuntime(9437): Caused by: Android.view.InflateException:
Binary XML file line #2: Error inflating class fragment 12-29
23:45:32.605: E/AndroidRuntime(9437):   at
Android.view.LayoutInflater.createViewFromTag(LayoutInflater.Java:697)
12-29 23:45:32.605: E/AndroidRuntime(9437):     at
Android.view.LayoutInflater.inflate(LayoutInflater.Java:466) 12-29
23:45:32.605: E/AndroidRuntime(9437):   at
Android.view.LayoutInflater.inflate(LayoutInflater.Java:396) 12-29
23:45:32.605: E/AndroidRuntime(9437):   at
Android.view.LayoutInflater.inflate(LayoutInflater.Java:352) 12-29
23:45:32.605: E/AndroidRuntime(9437):   at
com.Android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.Java:271)
12-29 23:45:32.605: E/AndroidRuntime(9437):     at
Android.app.Activity.setContentView(Activity.Java:1835) 12-29
23:45:32.605: E/AndroidRuntime(9437):   at
com.example.test_googlemap.MainActivity.onCreate(MainActivity.Java:11)
12-29 23:45:32.605: E/AndroidRuntime(9437):     at
Android.app.Activity.performCreate(Activity.Java:4465) 12-29
23:45:32.605: E/AndroidRuntime(9437):   at
Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1052)
12-29 23:45:32.605: E/AndroidRuntime(9437):     at
Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1932)
12-29 23:45:32.605: E/AndroidRuntime(9437):     ... 11 more 12-29
23:45:32.605: E/AndroidRuntime(9437): Caused by:
Java.lang.ClassCastException: com.google.Android.gms.maps.MapFragment
cannot be cast to Android.support.v4.app.Fragment 12-29 23:45:32.605:
E/AndroidRuntime(9437):     at
Android.support.v4.app.Fragment.instantiate(Fragment.Java:394) 12-29
23:45:32.605: E/AndroidRuntime(9437):   at
Android.support.v4.app.Fragment.instantiate(Fragment.Java:369) 12-29
23:45:32.605: E/AndroidRuntime(9437):   at
Android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.Java:272)
12-29 23:45:32.605: E/AndroidRuntime(9437):     at
Android.view.LayoutInflater.createViewFromTag(LayoutInflater.Java:669)
12-29 23:45:32.605: E/AndroidRuntime(9437):     ... 20 more



ソースコード :

package com.example.test_googlemap;

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

}



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



Manifest.xml:

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

    <uses-sdk
        Android:minSdkVersion="3"
        Android:targetSdkVersion="15" />

    <application
        Android:allowBackup="true"
        Android:icon="@drawable/ic_launcher"
        Android:label="@string/app_name"
        Android:theme="@style/AppTheme" >
        <activity
            Android:name="com.example.test_googlemap.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="I removed it!"/>
        </application>    
    <permission
        Android:name="com.example.Test_GoogleMap.permission.MAPS_RECEIVE"
        Android:protectionLevel="signature"/>
    <uses-permission Android:name="com.example.Test_GoogleMap.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-feature
        Android:glEsVersion="0x00020000"
        Android:required="true"/>

</manifest>
15
otheng

FragmentActivityを拡張しています。これは、Androidサポートパッケージのフラグメントのバックポートを使用しようとしていることを示しています。ただし、<fragment>要素はMapFragmentを参照します。これは、フラグメントのネイティブAPIレベル11エディション用です。

MapFragmentSupportMapFragmentに置き換えると、この特定のクラッシュが解消されます。

44
CommonsWare

同じ問題があり、次の2つのタグのうち1つだけを追加するのは間違いでした。 これら2つのうちの1つも欠落していることに注意してください

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

APIレベルのUIの問題を考えているので、実際のエラーは本当に誤解を招くものです。

5
urnenfeld

時には両方を使用しています-

<meta-data
Android:name="com.google.Android.maps.v2.API_KEY"
Android:value="<YOUR VALUE>"
/>
<meta-data
Android:name="com.google.Android.geo.API_KEY"
Android:value="<YOUR VALUE>"
/>

両方を使用しないでください...場所、場所、地図が必要な場合はgeo.API_KEYを使用し、場所と地図が必要な場合はmaps.v2.API_KEYを使用してください。

3
HarshitG

受け入れられた答えは正しいですが、私があなたと共有する意味のある情報です、私が直面しているのと同じ問題に直面している人かもしれません

すべてがGoogleコードと同じように機能している場合は、マニフェストファイルを確認してください。私の場合は、ジオキーとマップキーを追加したため、例外が発生します。

注-マニフェストファイルに2つのキーを追加しないでください。マップキーを削除してください

meta-data
        Android:name="com.google.Android.maps.v2.API_KEY"
        Android:value="@string/google_maps_key"/>

上記のコードとこのコードを追加します。

 <meta-data
        Android:name="com.google.Android.geo.API_KEY"
        Android:value="@string/auto_location"/>

 <meta-data
        Android:name="com.google.Android.gms.version"
        Android:value="@integer/google_play_services_version"/>
2
Yogesh Rathi

この問題は、andriod_manifest.xmlファイルのSDKバージョンの非互換性が原因で、activity_main.xml(またはres/layoutに存在するXMLファイル)で言及されているFragmentクラスを拡張できない場合にも発生します。

エミュレータでマップを取得するためのSDKレベルの正しいバージョンは次のとおりです。

     <uses-sdk
    Android:minSdkVersion="11"
    Android:targetSdkVersion="21" />
1
user3737478

私の場合、この例外をなくすために2つの修正を行わなければなりませんでした。

  1. アクティビティはFragmentActivityを拡張する必要があり、Activityではありません
  2. マニフェストファイルにはACCESS_NETWORK_STATEの使用権限が必要です(ファイルには既にインターネット権限が付与されています)
1
rpkrpk

既に回答済みの質問である場合でも、フラグメントでsuper.onCreateViewを呼び出すと、このエラーが発生する可能性があります。実行時にクラッシュします。

必ずonCreateViewメソッドをオーバーライドして、レイアウトを大きくしてください。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.my_fragment, container, false);
    return view;
}
1
Thibault Fig

この欠陥は、playサービスライブラリv9.0.0で解決されています。 https://code.google.com/p/gmaps-api-issues/issues/detail?id=9021#makechanges

1
Bharat Dodeja

インターネットのアクセス許可を使用して、マニフェストファイルの直接の子にしてください。以下のようにして試してください。

また、マップを使用するには次のものが必要です。

1.アクティビティファイルのMap activityを拡張する必要があります

2.APIキーが必要です。コードにキーがありませんでした。

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


    <uses-permission Android:name="Android.permission.INTERNET"/>
    <uses-sdk
        Android:minSdkVersion="3"
        Android:targetSdkVersion="15" />
0
Subburaj