web-dev-qa-db-ja.com

バイナリXMLファイルの8行目:クラスフラグメントのインフレーションエラー、Googleマップ

このアプリでは、機能的なV2グーグルマップを追加しようとしています。アクティビティの作成、マップのキーの取得、およびxmlファイルの作成に関するチュートリアルのほとんどを見て、ステップを逃したかどうかを確認しました(4回のように実行しました)が、そうではありません。ステップを逃したようです。

ここ は私が使用したサイトです:

携帯電話でアプリを実行すると(Google Play開発者サービスはエミュレーターで機能しないため)、次の2つのエラーが発生します。

  02-11 22:10:54.690: E/AndroidRuntime(4526): Java.lang.RuntimeException: Unable to       start activity ComponentInfo{com.example.myfirstapp/com.example.myfirstapp.ShowActivity}:       Android.view.InflateException: Binary XML file line #8: Error inflating class fragment
  02-11 22:10:54.690: E/AndroidRuntime(4526): 

  Caused by: Android.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

これが私の活動です:

package com.example.myfirstapp;

import Android.app.Activity;
import Android.os.Bundle;
import Android.support.v4.app.FragmentActivity;
import Android.view.Menu;
import com.google.Android.maps.*;
import com.google.Android.gms.maps.MapFragment;
public class ShowActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_map, menu);
    return true;
}

//@Override
//protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub
    //return false;
//}

    }

フォーマットして申し訳ありませんが、ここに私の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=".ShowActivity" >

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

  </RelativeLayout>

GoogleAPIとGooglePlay開発者サービスをインポートしたので、すべてのインポートが機能しています。これにより、2番目のエラーでMapFragmentが空であると表示されたのはなぜか疑問に思います。マニフェストファイルコード:

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

<uses-permission Android:name="Android.permission.READ_CONTACTS" />
<uses-permission Android:name="Android.permission.SUBSCRIBED_FEEDS_READ" />
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission        Android:name="com.google.Android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission Android:name="Android.permission.INTERNET" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission Android:name="com.example.myfirstapp.permission.MAPS_RECEIVE" />
<permission
    Android:name="com.example.myfirstapp.permission.MAPS_RECEIVE"
    Android:protectionLevel="signature" />

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

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

<application
    Android:icon="@drawable/ic_launcher"
    Android:label="@string/app_name"
    Android:theme="@style/AppTheme" >
    <activity
        Android:name="com.example.myfirstapp.MainActivity"
        Android:label="@string/title_activity_main" >
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

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

        <meta-data
            Android:name="Android.app.default_searchable"
            Android:value=".SearchResultsActivity" />
    </activity>
    <activity
        Android:name="com.example.myfirstapp.SearchResultsActivity"
        Android:label="@string/title_activity_search_results"
        Android:launchMode="singleTop" >
        <intent-filter>
            <action Android:name="Android.intent.action.SEARCH" />
        </intent-filter>

        <meta-data
            Android:name="Android.app.searchable"
            Android:resource="@xml/searchable" />
    </activity>
    <activity
        Android:name="com.example.myfirstapp.AddContacts"
        Android:label="@string/title_activity_add_contacts" >
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        Android:name="com.example.myfirstapp.ContactActivity"
        Android:label="@string/title_activity_contact" >
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        Android:name="com.example.myfirstapp.DisplayInfo"
        Android:label="@string/title_activity_display_info" >
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

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

    <provider
        Android:name="com.example.myfirstapp.SomeProvider"
        Android:authorities="com.example.myfirstapp.SomeProvider" >
    </provider>

    <activity
        Android:name="com.example.myfirstapp.EditContacts"
        Android:label="@string/title_activity_edit_contacts" >
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        Android:name="com.example.myfirstapp.DeleteContact"
        Android:label="@string/title_activity_delete_contact" >
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        Android:name="com.example.myfirstapp.FlightInfo"
        Android:label="@string/title_activity_flight_info" >
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        Android:name="com.example.myfirstapp.EventInfo"
        Android:label="@string/title_activity_event_info" >
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        Android:name="com.example.myfirstapp.ContactsActivity"
        Android:label="@string/title_activity_contacts" >
    </activity>
    <activity
        Android:name="com.example.myfirstapp.ShowActivity"
        Android:label="@string/title_activity_map" >
    </activity>

    <meta-data
        Android:name="com.google.Android.maps.v2.API_KEY"
        Android:value="removed" />
<uses-library Android:name="com.google.Android.maps" />
</application>

</manifest>
7
Sai Valluri

以下のコードを試してください:

public class ShowActivity extends Android.support.v4.app.FragmentActivity {
    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);
        setUpMapIfNeeded();
    }

    @Override
    protected void onResume() {
        super.onResume();
        setUpMapIfNeeded();
    }

    private void setUpMapIfNeeded() {
        // Do a null check to confirm that we have not already instantiated the map.
        if (mMap == null) {
            // Try to obtain the map from the SupportMapFragment.
            mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                    .getMap();
            // Check if we were successful in obtaining the map.
            if (mMap != null) {
                setUpMap();
            }
        }
    }
}

XMLファイルコード:

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

マニフェストファイルコード:

    <permission
        Android:name="com.example.myfirstapp.permission.MAPS_RECEIVE"
        Android:protectionLevel="signature"/>
      <uses-permission Android:name="com.example.myfirstapp.permission.MAPS_RECEIVE"/>
        <!-- Copied from Google Maps Library/AndroidManifest.xml. -->
      <uses-sdk
                Android:minSdkVersion="8"
                Android:targetSdkVersion="16"/>
        <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"/>
      <uses-feature
        Android:glEsVersion="0x00020000"
        Android:required="true"/>
      <application
        Android:icon="@drawable/ic_launcher"
        Android:label="@string/app_name"
        Android:theme="@style/AppTheme" >    
         <meta-data
            Android:name="com.google.Android.maps.v2.API_KEY"
            Android:value="removed" />
   </application>
6
GrIsHu

私は以下の手順に従いました::

ステップ1:マニフェストに以下の行を含め、アプリケーションタグ内に必ず追加してください

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

例::

 <application
        Android:name="taxialways.user.MyApplication"
        Android:allowBackup="true"
        Android:icon="@drawable/ic_launcher"
        Android:label="@string/app_name"
        Android:theme="@style/AppTheme" >

        <activity
            Android:name="taxialways.user.Register"
            Android:label="@string/title_activity_register"
            Android:noHistory="true"
            Android:screenOrientation="portrait" >
        </activity>

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

ステップ2:アクティビティが拡張されていることを確認してくださいFragmentActivity


ステップ3:xmlで以下のようにmapFragment要素を使用します

  <fragment
    Android:id="@+id/map"
    Android:name="com.google.Android.gms.maps.SupportMapFragment"
    Android:layout_width="fill_parent"
    Android:layout_height="match_parent"
    Android:layout_alignParentBottom="true"
    Android:layout_below="@+id/lineartab" />

2
Devrath

Google Play開発者サービスV2(Googleマップ機能用)をAndroid 2.3.4。(APIレベル10)にデプロイしようとしていますが、同じ問題が発生しました。解決方法は次のとおりです。

  1. google-play-services_libをライブラリとして含める必要がありました。 Eclipseでは、これを次のように実行できます。

    • Android SDKManagerを使用してライブラリをダウンロードします。
    • 新しい既存のコードからのAndroidプロジェクトを作成します。ここで、SDKのインストールに使用したフォルダー内のgoogle-play-services_libをポイントします。 1つ上のレベル(libproject)を使用しました。
    • プロジェクト->プロパティ-> Androidの下で、このプロジェクトにライブラリのフラグを付けます。
    • プロジェクトで、プロジェクト->プロパティ-> Androidも開き、ライブラリセクションで追加をクリックします。 google-play-services_libを選択します。 com_google_Android_gmsとして表示されます。

    これは重要です。ライブラリのプロジェクトビルドターゲットが、アプリで使用されているものと同じであることを確認してください。

  2. APIバージョンが11未満であるため、MapFragmentの代わりにSupportMapFragmentが使用されます。

お役に立てれば。これを解決するのに少なくとも3時間かかりました。

2
user1357851

マニフェストに次の行を追加します

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