Android – SupportMapFragment con GoogleMaps API 2.0 con IllegalArgumentException

Intento utilizar la última Map API 2.0 para Android. Estoy usando la biblioteca de soporte porque quiero dar soporte a Android 2.2. Lo siguiente es mi código:

Clase de actividad principal

public class MainActivity extends FragmentActivity { public FragmentManager fManager ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fManager = getSupportFragmentManager(); Button showMapButton = (Button) findViewById(R.id.showMapButton); showMapButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { loadMapFragment(); } }); } private void loadMapFragment() { MapPageFragment plotterFragment = new MapPageFragment(); FragmentTransaction ft = fManager.beginTransaction(); ft.replace(R.id.allFragmentsFrameLayout, plotterFragment); ft.addToBackStack(null); ft.commit(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } } 

Archivo de diseño de la actividad principal

  

Clase de fragmento de mapa

 public class MapPageFragment extends SupportMapFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); return inflater.inflate(R.layout.map_fragment_layout, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); } } 

Diseño de fragmentos de mapa

   

Archivo de manifiesto de Android

                      

Todo funciona bien por primera vez. es decir, cuando hago clic en el botón Show Map el fragmento del mapa se carga y muestra el mapa. Cuando presiono el botón Atrás , el fragmento del mapa se descarga y puedo volver a ver el botón Show Map .

Me enfrento a un problema cuando presiono el botón Show Map nuevo. Obtuve el siguiente error:

 FATAL EXCEPTION: main android.view.InflateException: Binary XML file line #2: Error inflating class fragment at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:699) at android.view.LayoutInflater.inflate(LayoutInflater.java:468) at android.view.LayoutInflater.inflate(LayoutInflater.java:397) at com.mapfragmentexample.MapPageFragment.onCreateView(MapPageFragment.java:17) at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444) at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429) at android.os.Handler.handleCallback(Handler.java:605) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4503) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.IllegalArgumentException: Binary XML file line #2: Duplicate id 0x7f040006, tag null, or parent id 0x0 with another fragment for com.google.android.gms.maps.SupportMapFragment at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:285) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:671) ... 18 more 

No estoy llegando a donde me estoy equivocando o me estoy perdiendo de nada.

    Puede solucionar esto si elimina todos los fragmentos nesteds en onDestroyView() . No sé si es una solución adecuada.

     public void onDestroyView() { super.onDestroyView(); Fragment fragment = (getFragmentManager().findFragmentById(R.id.map)); FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); ft.remove(fragment); ft.commit(); } 

    E onCreateView() como de costumbre en onCreateView()

     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.map, container, false); } 

    Necesita usar getChildFragmentManager () para agregar SupportMapFragment no a través de xml.

    Para “por qué”, consulte la documentación oficial: http://developer.android.com/about/versions/android-4.2.html#NestedFragments

    Mire mi respuesta aquí: https://stackoverflow.com/a/15512285/2183804

    No puede inflar un diseño en un fragmento cuando ese diseño incluye un fragmento . Los fragmentos nesteds solo se admiten cuando se agregan a un fragmento de forma dinámica. Más detalles aquí !

    Usó esta solución (similar a otras):

     public void onDestroyView() { FragmentManager fm = getActivity().getSupportFragmentManager(); Fragment fragment = (fm.findFragmentById(R.id.map)); if (fragment.isResumed()) { FragmentTransaction ft = fm.beginTransaction(); ft.remove(fragment); ft.commit(); } super.onDestroyView(); } 

    Tuve problemas antes de usar if (fragment.isResumed).

    Estaba enfrentando el mismo problema en JakeWhartonViewPagerIndicatore junto con SherlockFragments. Aquí está el ejemplo TestFragment con un problema resuelto, gracias a Natalia por proporcionar la solución anterior. Tu fragmento puede ser un poco diferente al mío.

    Referencia: hacer que ActionBarSherlock y ViewPagerIndicator jueguen bien

    Buena suerte..!!

     package com.example.vpiabstest; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.actionbarsherlock.app.SherlockFragment; public class TestFragment extends SherlockFragment { private String mContent = "???"; private String text; private static final String KEY_TAB_NUM = "key.tab.num"; public static TestFragment newInstance(String text) { TestFragment fragment = new TestFragment(); // Supply num input as an argument. Bundle args = new Bundle(); args.putString(KEY_TAB_NUM, text); fragment.setArguments(args); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { text = getString(R.string.tab_page_num) + mContent; View view = null; if(text.contains("2")) { view = inflater.inflate(R.layout.pinpoints_list, null); } else if(text.contains("1")) { view = inflater.inflate(R.layout.main_fragment_activity, null); } else { view = inflater.inflate(R.layout.activity_main, null); ((TextView)view.findViewById(R.id.text)).setText(text); } return view; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContent = getArguments() != null ? getArguments().getString(KEY_TAB_NUM) : "???"; } public void onDestroyView() { super.onDestroyView(); // Your Programing skills goes here if(text == null || !text.contains("1")) { return; } // Do Not Miss this try { Fragment fragment = (getFragmentManager().findFragmentById(R.id.map_fragment)); FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); ft.remove(fragment); ft.commit(); } catch (Exception e) { e.printStackTrace(); } } } 

    Use el método onCreate() causa dialog.SetContentView() de su actividad cuando intentemos cargar.

    Diálogo nuevamente carga solo el diálogo, no todo el ciclo de vida de la actividad y lo lleva a la excepción de la identificación duplicada.

    Intentalo.

    Prueba esto

    Diseño de fragmento de mapas

     < ?xml version="1.0" encoding="utf-8"?>  

    Clase de fragmento de mapa

     public class MapPageFragment extends SupportMapFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = super.onCreateView(inflater, container, savedInstanceState); if (rootView == null) { rootView = inflater.inflate(R.layout.map_fragment_layout, container, false); } return rootView; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); } } 

    Usé la respuesta de Natalia pero a veces rompí la aplicación. Usa este y funcionó perfectamente sin romperse.

     @Override public void onDestroyView() { try{ FragmentTransaction transaction = getSupportFragmentManager() .beginTransaction(); transaction.remove(nestedFragment); transaction.commit(); }catch(Exception e){ } super.onDestroyView(); } 

    https://stackoverflow.com/a/7953801/3364157

     Fragment fragment = (getChildFragmentManager().findFragmentById(R.id.mapview)); FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); ft.remove(fragment); ft.commit(); 

    Use esto ahorra el día.

    Usa banderas de intención:

     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 

    al llamar a la actividad principal.

    Yo tuve el mismo problema. Intenta agregar …

     android:name="com.mapfragmentexample.MapPageFragment" 

    … para fragment en el archivo de diseño!