Google Map V2 error and invalidating class fragmentation error

I create a tab application and I have a map on one of the tabs, when I open a map from it it works fine, and when I visit some other tab, this time works fine, but when I return to the map the tab application with this mistake.

04-09 14:10:43.866: E/AndroidRuntime(28184): android.view.InflateException: Binary XML file line #42: Error inflating class fragment 04-09 14:10:43.866: E/AndroidRuntime(28184): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:697) 04-09 14:10:43.866: E/AndroidRuntime(28184): at android.view.LayoutInflater.rInflate(LayoutInflater.java:739) 04-09 14:10:43.866: E/AndroidRuntime(28184): at android.view.LayoutInflater.rInflate(LayoutInflater.java:742) 04-09 14:10:43.866: E/AndroidRuntime(28184): at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 04-09 14:10:43.866: E/AndroidRuntime(28184): at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 04-09 14:10:43.866: E/AndroidRuntime(28184): at com.research.fragmenttabstudy.tabA.TodaysDealLocation.onCreateView(TodaysDealLocation.java:43) 

Here is my code:

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d("err","todaysdeal location"); Log.d("err","todaysdeal location"+inflater.toString()+" "+container.toString()+" "); super.onCreateView(inflater, container, savedInstanceState); // map.clear(); View view = inflater.inflate(R.layout.todays_deal_location, container, false); Log.d("err",view.toString()); back = (ImageView) view.findViewById(R.id.list); back.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub // Constants.passcode_chk = 0; // finish(); mActivity.popFragments(); } }); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); map = ((SupportMapFragment) getFragmentManager().findFragmentById( R.id.mapp)).getMap(); map.setMapType(GoogleMap.MAP_TYPE_NORMAL); } 

XML:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ImageView android:id="@+id/imageView1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:src="@drawable/topbar" /> <!-- <ImageView --> <!-- android:id="@+id/deallistmenu" --> <!-- android:layout_width="wrap_content" --> <!-- android:layout_height="wrap_content" --> <!-- android:layout_marginLeft="5dp" --> <!-- android:layout_marginTop="9dp" --> <!-- android:src="@drawable/deallist_menubtn" /> --> <ImageView android:id="@+id/list" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_marginRight="7dp" android:layout_marginTop="7dp" android:src="@drawable/map_list" /> <RelativeLayout android:id="@+id/frameLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/imageView1" android:layout_marginTop="-4.8dp" > <!-- box layout.................................................................... --> <!-- box layout.................................................................... --> <fragment android:id="@+id/mapp" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/tv_location" android:name="com.google.android.gms.maps.SupportMapFragment" /> <!-- <ZoomControls --> <!-- android:id="@+id/zoomControls" --> <!-- android:layout_width="wrap_content" --> <!-- android:layout_height="wrap_content" --> <!-- android:layout_alignParentBottom="true" --> <!-- android:layout_alignParentLeft="true" --> <!-- android:layout_marginBottom="30dp" --> <!-- android:layout_marginLeft="100dp" /> --> </RelativeLayout> <TextView android:id="@+id/barTitle" android:layout_width="match_parent" android:layout_height="50dp" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:gravity="center" android:lines="1" android:maxLines="1" android:paddingLeft="50dip" android:paddingRight="55dip" android:singleLine="true" android:text="" android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="@android:color/white" android:textSize="18dp" /> </RelativeLayout> 
+6
source share
5 answers

Your problem is that you declared the google maps v2 fragment in XML, so every time you inflate the XML, it creates a new fragment. However, the fragment identifier is hardcoded in XML, so it will try to create a new fragment with the same identifier as the one that is already running. Two running fragments do not have the same identifier, so the application crashes.

The best way to fix this is to make a software fragment of the map. A good example of this can be found in ProgrammaticDemoActivity.java in the Google Maps sample project.

However, if for some reason you have to declare your fragment in XML, you can make it work by killing the old map fragment when you leave the view so that you can create a new one.

You can do something like:

 private void killOldMap() { SupportMapFragment mapFragment = ((SupportMapFragment) getSherlockActivity() .getSupportFragmentManager().findFragmentById(R.id.map)); if(mapFragment != null) { FragmentManager fM = getFragmentManager(); fM.beginTransaction().remove(mapFragment).commit(); } } 

and then call it from onDetach() and onDestroyView() to make sure the old map is killed.

As you can see, this is a kind of hack, and your best bet is to just create an application programmatically instead of using XML.

+18
source

Try it...

call this function from onDetach () and onDestroyView () to kill the fragment transaction.

 private void commitMaps() { if (null != mapFragment) { getFragmentManager().beginTransaction().remove(mapFragment).commitAllowingStateLoss(); } } 

sometimes you get "IllegalStateException: cannot perform this action after onSaveInstanceState" if you commit a map () transaction. To avoid this exception, you should use commitAllowingStateLoss () when you delete an existing transaction.

Difference between commit () and commitAllowingStateLoss ()

+2
source

Make sure your activity expands the fragment and replaces

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

and delete " android:layout_below="@+id/tv_location" because it is inside relative layout "

Go with it and let me know.

0
source

One map fragment has already been created, and when you try to return to the map page, it tries to create another fragment on top of it. Below code finally works fine for me:

XML:

 <fragment 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" android:id="@+id/map" android:name="com.google.android.gms.maps.SupportMapFragment"/> 

Note that instead of MapFragment, I used SupportMapFragment.

JAVA:

  @Override public void onDestroyView() { super.onDestroyView(); Fragment f = getActivity().getSupportFragmentManager().findFragmentById(R.id.map); if (f != null) getFragmentManager().beginTransaction().remove(f).commit(); } 
0
source

The first problem that I see here with the code you presented is the line:

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

You are trying to get a SupportMapFragment object using a regular FragmentManager . this is not true. To get a SupportMapFragment object, you must use the SupportFragmentManager as follows:

 map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapp)).getMap(); 

But I assume that the problems you are currently facing are not yet derived from this error. I think you are incorrectly referencing the google-play-services library of google-support-v4 library.

You can take a look at this blog post that I wrote about how to add the Google Map API V2 to your application:

Google Map API V2

UPDATE:

if you min SDK is 11, you can change the fragment to this code:

 <fragment android:id="@+id/mapp" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/tv_location" android:name="com.google.android.gms.maps.MapFragment" /> 
-1
source

All Articles