7

I have a navigation drawer with some fragments. Each Fragment has a MapFragment in the layout. Initially, when the app runs the navigation drawer clicks open up the fragment once, but when I click the same navigation item to open up the same fragment second time (after visiting other fragments)I get the following error in the onCreateView()

Binary XML file line #1: Error inflating class fragment 

Below is my code for the fragment:

user_map_Fragment.xml

 <LinearLayout
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:id="@+id/parentContainer"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
        <fragment
            android:id="@+id/map"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:name="com.google.android.gms.maps.MapFragment"/>

......
</LinearLayout>

MainFragment.cs

public class MainFragement : Android.Support.V4.App.Fragment, IOnMapReadyCallback, ILocationListener, Android.Views.View.IOnKeyListener
    {

        private GoogleMap mMap;

        private LocationManager _locationManager;
        private string _locationProvider;
        private Android.Locations.Location _currentLocation;

        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            if (v == null)
            {
                v = inflater.Inflate(Resource.Layout.Main, container, false);

                SetUpMap();
                InitializeLocationManager();

            }
            return v;
        }
}



private void SetUpMap()
        {
            if (mMap == null)
            {
                Activity.FragmentManager.FindFragmentById<MapFragment>(Resource.Id.map).GetMapAsync(this);
            }
        }

Crash Log:

06-22 10:56:50.798 E/mono-rt (15470): java.lang.IllegalArgumentException: Binary XML file line #1: Duplicate id 0x7f0a0099, tag null, or parent id 0x7f0a007b with another fragment for com.google.android.gms.maps.MapFragment
06-22 10:56:50.798 E/mono-rt (15470):   at android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2136)
06-22 10:56:50.798 E/mono-rt (15470):   at android.app.Activity.onCreateView(Activity.java:5516)
06-22 10:56:50.798 E/mono-rt (15470):   at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:34)
06-22 10:56:50.798 E/mono-rt (15470):   at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:78)
06-22 10:56:50.798 E/mono-rt (15470):   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:733)
06-22 10:56:50.798 E/mono-rt (15470):   at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
06-22 10:56:50.798 E/mono-rt (15470):   at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
06-22 10:56:50.798 E/mono-rt (15470):   at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
06-22 10:56:50.798 E/mono-rt (15470):   at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
06-22 10:56:50.798 E/mono-rt (15470):   at md5ec4b17f0066095dde498afe2bdaa8cb9.PeopleCheckinFragment.n_onCreateView(Native Method)
06-22 10:56:50.798 E/mono-rt (15470):   at md5ec4b17f0066095dde498afe2bdaa8cb9.PeopleCheckinFragment.onCreateView(PeopleCheckinFragment.java:39)
06-22 10:56:50.798 E/mono-rt (15470):   at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962)
06-22 10:56:50.798 E/mono-rt (15470):   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1026)
06-22 10:56:50.798 E/mono-rt (15470):   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1207)
06-22 10:56:50.798 E/mono-rt (15470):   at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
06-22 10:56:50.798 E/mono-rt (15470):   at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1572)
06-22 10:56:50.798 E/mono-rt (15470):   at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:493)
06-22 10:56:50.798 E/mono-rt (15470):   at android.os.Handler.handleCallback(Handler.java:739)
06-22 10:56:50.798 E/mono-rt (15470):   at android.os.Handler.dispatchMessage(Handler.java:95)
06-22 10:56:50.798 E/mono-rt (15470):   at android.os.Looper.loop(Looper.java:135)
06-22 10:56:50.798 E/mono-rt (15470):   at android.app.ActivityThread.main(ActivityThread.java:5930)
06-22 10:56:50.798 E/mono-rt (15470):   at java.lang.reflect.Method.invoke(Native Method)
06-22 10:56:50.798 E/mono-rt (15470):   at java.lang.reflect.Method.invoke(Method.java:372)
06-22 10:56:50.798 E/mono-rt (15470):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405)
06-22 10:56:50.798 E/mono-rt (15470):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)

How do I solve this?

hello world
  • 797
  • 1
  • 9
  • 31

4 Answers4

9

Instead of this

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

use this

 <fragment
            android:id="@+id/map"
            android:name="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="match_parent"
            android:layout_height="200dp"
             />

in java class

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class ClinicFragment extends Fragment implements OnMapReadyCallback {

    private GoogleMap mMap;

    public static ClinicFragment newInstance() {
        ClinicFragment fragment = new ClinicFragment();
        return fragment;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_maps, null, false);

        SupportMapFragment mapFragment = (SupportMapFragment) this.getChildFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        return view;
    }


    /**
     * Manipulates the map once available.
     * This callback is triggered when the map is ready to be used.
     * This is where we can add markers or lines, add listeners or move the camera. In this case,
     * we just add a marker near Sydney, Australia.
     * If Google Play services is not installed on the device, the user will be prompted to install
     * it inside the SupportMapFragment. This method will only be triggered once the user has
     * installed Google Play services and returned to the app.
     */
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        // Add a marker in Sydney and move the camera
        LatLng sydney = new LatLng(-34, 151);
        mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
    }
}
Harshad Pansuriya
  • 20,189
  • 8
  • 67
  • 95
  • Thanks for the answer. Could you elaborate how can I use this furter in my Fragment class? I get an error in SetUpMap(), which says I cannot implicitly convert MapFragment to SupportMapFragment. And If I use Activity.SupportFragmentManager.FindFragmentById(Resource.Id.map).GetMapAsync(this);, I cannot use GetMapAsync(this) – hello world Jun 22 '16 at 05:41
  • I get and error at mMap = mapFrag.getMap(); saying Cannot implicitly void to Android.Gms.Maps.GoogleMap. – hello world Jun 22 '16 at 05:50
  • I want to have this functionality inside a FRagment – hello world Jun 22 '16 at 05:55
  • This solution worked. Thanks for all the help . Really appreciate the way you provided the answers per my requirement. – hello world Jun 22 '16 at 06:17
  • @helloworld glad to help you. – Harshad Pansuriya Jun 22 '16 at 06:19
1

Try to change

android:name="com.google.android.gms.maps.SupportMapFragment"
//and
Activity.FragmentManager.FindFragmentById<SupportMapFragment>(Resource.Id.map).GetMapAsync(this);

instead of

android:name="com.google.android.gms.maps.MapFragment"
//and
Activity.FragmentManager.FindFragmentById<MapFragment>(Resource.Id.map).GetMapAsync(this);

EDIT 1

remove your android.app.Fragment and import support packages

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;

EDIT 2

Try this

SupportMapFragment m = ((SupportMapFragment) getChildFragmentManager()
    .findFragmentById(R.id.map));

this may helps you

Sathish Kumar J
  • 4,280
  • 1
  • 20
  • 48
  • Hi, Thanks for the answer. I tried your solution but I get an error There is no implicit reference conversion between Android.Gms.Maps.SupportMapFragment and Android.App.Fragment" – hello world Jun 22 '16 at 05:46
  • As you see in my question I already extend my class from Android.Support.v4.App.Fragment – hello world Jun 22 '16 at 05:54
  • Thanks for the help Sathish Kumar J. Ironman post the answer tad bit before you so accepting his answer as it was more elaborate. Still upvoting yours for all the help you provided – hello world Jun 22 '16 at 06:18
1

For my case I forgot to add API_KEY in google map even if I was using SupportMapFragment.

<fragment
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="200dp" />

In manifest:

<meta-data
    android:name="com.google.android.geo.API_KEY"
    android:value="@string/google_maps_key" />
Nik
  • 1,991
  • 2
  • 13
  • 30
0

android:hardwareAccelerated="true" to my MapsActivity on AndroidManifest.xml

Worked for me.

Milad Faridnia
  • 9,113
  • 13
  • 65
  • 78
yasir khan
  • 419
  • 4
  • 6