Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android Adding Maps v2 API to Master Detail Flow - Error inflating class fragment

I am trying to add a Google Maps view using the version 2 API to the built in Android Master Detail flow. For some reason I am getting a error inflating class fragment exception:

    12-29 22:47:05.828: E/AndroidRuntime(1655): FATAL EXCEPTION: main
12-29 22:47:05.828: E/AndroidRuntime(1655): android.view.InflateException: Binary XML file line #48: Error inflating class fragment
12-29 22:47:05.828: E/AndroidRuntime(1655):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:697)
12-29 22:47:05.828: E/AndroidRuntime(1655):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:739)
12-29 22:47:05.828: E/AndroidRuntime(1655):     at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
12-29 22:47:05.828: E/AndroidRuntime(1655):     at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
12-29 22:47:05.828: E/AndroidRuntime(1655):     at com.reading.trackitparent.MapDetailFragment.onCreateView(MapDetailFragment.java:52)
12-29 22:47:05.828: E/AndroidRuntime(1655):     at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
12-29 22:47:05.828: E/AndroidRuntime(1655):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
12-29 22:47:05.828: E/AndroidRuntime(1655):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
12-29 22:47:05.828: E/AndroidRuntime(1655):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
12-29 22:47:05.828: E/AndroidRuntime(1655):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
12-29 22:47:05.828: E/AndroidRuntime(1655):     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)
12-29 22:47:05.828: E/AndroidRuntime(1655):     at android.os.Handler.handleCallback(Handler.java:605)
12-29 22:47:05.828: E/AndroidRuntime(1655):     at android.os.Handler.dispatchMessage(Handler.java:92)
12-29 22:47:05.828: E/AndroidRuntime(1655):     at android.os.Looper.loop(Looper.java:137)
12-29 22:47:05.828: E/AndroidRuntime(1655):     at android.app.ActivityThread.main(ActivityThread.java:4424)
12-29 22:47:05.828: E/AndroidRuntime(1655):     at java.lang.reflect.Method.invokeNative(Native Method)
12-29 22:47:05.828: E/AndroidRuntime(1655):     at java.lang.reflect.Method.invoke(Method.java:511)
12-29 22:47:05.828: E/AndroidRuntime(1655):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-29 22:47:05.828: E/AndroidRuntime(1655):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-29 22:47:05.828: E/AndroidRuntime(1655):     at dalvik.system.NativeStart.main(Native Method)
12-29 22:47:05.828: E/AndroidRuntime(1655): Caused by: java.lang.ClassCastException: com.google.android.gms.maps.MapFragment cannot be cast to android.support.v4.app.Fragment
12-29 22:47:05.828: E/AndroidRuntime(1655):     at android.support.v4.app.Fragment.instantiate(Fragment.java:394)
12-29 22:47:05.828: E/AndroidRuntime(1655):     at android.support.v4.app.Fragment.instantiate(Fragment.java:369)
12-29 22:47:05.828: E/AndroidRuntime(1655):     at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:272)
12-29 22:47:05.828: E/AndroidRuntime(1655):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:669)

I have created a new MapDetailFragment:

package com.reading.trackitparent;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.reading.trackitparent.dummy.DummyContent;

/**
 * A fragment representing a single Item detail screen. This fragment is either
 * contained in a {@link ItemListActivity} in two-pane mode (on tablets) or a
 * {@link ItemDetailActivity} on handsets.
 */
public class MapDetailFragment extends Fragment {
    /**
     * The fragment argument representing the item ID that this fragment
     * represents.
     */
    public static final String ARG_ITEM_ID = "item_id";

    /**
     * The dummy content this fragment is presenting.
     */
    private DummyContent.DummyItem mItem;

    /**
     * Mandatory empty constructor for the fragment manager to instantiate the
     * fragment (e.g. upon screen orientation changes).
     */
    public MapDetailFragment() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (getArguments().containsKey(ARG_ITEM_ID)) {
            // Load the dummy content specified by the fragment
            // arguments. In a real-world scenario, use a Loader
            // to load content from a content provider.
            mItem = DummyContent.ITEM_MAP.get(getArguments().getString(
                    ARG_ITEM_ID));
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_map_detail,
                container, false);

//      // Show the dummy content as text in a TextView.
//      if (mItem != null) {
//          ((TextView) rootView.findViewById(R.id.item_detail))
//                  .setText(mItem.content);
//      }

        return rootView;
    }
}

and I am trying to use the following layout:

<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=".ItemDetailActivity" >

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

ItemListActivity:

package com.reading.trackitparent;

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

/**
 * An activity representing a list of Items. This activity has different
 * presentations for handset and tablet-size devices. On handsets, the activity
 * presents a list of items, which when touched, lead to a
 * {@link ItemDetailActivity} representing item details. On tablets, the
 * activity presents the list of items and item details side-by-side using two
 * vertical panes.
 * <p>
 * The activity makes heavy use of fragments. The list of items is a
 * {@link ItemListFragment} and the item details (if present) is a
 * {@link ItemDetailFragment}.
 * <p>
 * This activity also implements the required {@link ItemListFragment.Callbacks}
 * interface to listen for item selections.
 */
public class ItemListActivity extends FragmentActivity implements
        ItemListFragment.Callbacks {

    /**
     * Whether or not the activity is in two-pane mode, i.e. running on a tablet
     * device.
     */
    private boolean mTwoPane;

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

        if (findViewById(R.id.item_detail_container) != null) {
            // The detail container view will be present only in the
            // large-screen layouts (res/values-large and
            // res/values-sw600dp). If this view is present, then the
            // activity should be in two-pane mode.
            mTwoPane = true;

            // In two-pane mode, list items should be given the
            // 'activated' state when touched.
            ((ItemListFragment) getSupportFragmentManager().findFragmentById(
                    R.id.item_list)).setActivateOnItemClick(true);
        }

        // TODO: If exposing deep links into your app, handle intents here.
    }

    /**
     * Callback method from {@link ItemListFragment.Callbacks} indicating that
     * the item with the given ID was selected.
     */
    @Override
    public void onItemSelected(String id) {
        if (mTwoPane) {
            // In two-pane mode, show the detail view in this activity by
            // adding or replacing the detail fragment using a
            // fragment transaction.
            Bundle arguments = new Bundle();
            arguments.putString(MapDetailFragment.ARG_ITEM_ID, id);
            MapDetailFragment fragment = new MapDetailFragment();
            fragment.setArguments(arguments);
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.item_detail_container, fragment).commit();

        } else {
            // In single-pane mode, simply start the detail activity
            // for the selected item ID.
            Intent detailIntent = new Intent(this, ItemDetailActivity.class);
            detailIntent.putExtra(MapDetailFragment.ARG_ITEM_ID, id);
            startActivity(detailIntent);
        }
    }
}

I have referenced the Google Play Services Libs. My manifest looks like so:

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

    <permission
        android:name="com.reading.trackitparent.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" />

    <uses-permission android:name="com.reading.trackitparent.permission.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" />

    <uses-sdk
        android:minSdkVersion="15"
        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.reading.trackitparent.ItemListActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.reading.trackitparent.ItemDetailActivity"
            android:label="@string/title_item_detail" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".ItemListActivity" />
        </activity>

        <uses-library android:name="com.google.android.maps" />
    </application>

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

</manifest>

I would really appreciate any help!

like image 864
James Cross Avatar asked Dec 29 '12 22:12

James Cross


People also ask

What is mapfragment in Android Studio?

public class MapFragment extends Fragment. A Map component in an app. This fragment is the simplest way to place a map in an application. It's a wrapper around a view of a map to automatically handle the necessary life cycle needs. Being a fragment, this component can be added to an activity's layout file simply with the XML below.

What is a fragment in Android?

Fragments. A Fragment represents a reusable portion of your app's UI. A fragment defines and manages its own layout, has its own lifecycle, and can handle its own input events. Fragments cannot live on their own--they must be hosted by an activity or another fragment. The fragment’s view hierarchy becomes part of, or attaches to , ...

How do I add a fragment to an activity's layout file?

Being a fragment, this component can be added to an activity's layout file simply with the XML below. A GoogleMap must be acquired using getMapAsync (OnMapReadyCallback). This class automatically initializes the maps system and the view.

What is the use of a fragment map?

It's a wrapper around a view of a map to automatically handle the necessary life cycle needs. Being a fragment, this component can be added to an activity's layout file simply with the XML below. A GoogleMap must be acquired using getMapAsync (OnMapReadyCallback).


1 Answers

Replace MapFragment with SupportMapFragment. SupportMapFragment is the one to use with the Android Support package backport of fragments. MapFragment is for the native API Level 11 version of fragments.

like image 121
CommonsWare Avatar answered Oct 02 '22 12:10

CommonsWare