reales - libro de android studio en español pdf
Error al inflar el fragmento de clase: ID duplicado, nulo de etiqueta o id principal con otro fragmento (3)
Intento crear una aplicación en la que cuando el usuario haga clic en un elemento en ListView, se muestre GoogleMaps.
He intentado seguir el código:
ShowPlacesActivity.java
public class ShowPlaceActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_place);
if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.add(R.id.container_showplaces, new PlaceholderFragment())
.commit();
}
getActionBar().setSubtitle(getString(R.string.activity_showplaces_subtitle));
}
}
activity_show_place.xml
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container_showplaces"
android:layout_width="match_parent" android:layout_height="match_parent"
tools:context="com.krupal.rememberthisplace.ShowPlaceActivity" tools:ignore="MergeRootFrame" />
fragment_show_place.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:orientation="vertical"
>
<ListView
android:id="@+id/listView_places"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>
fragment_maps.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<fragment
android:id="@+id/mymap"
android:name="com.google.android.gms.maps.MapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
Quiero mostrar mapas en el elemento de la vista de lista clic ... por lo tanto, he implementado dos fragmentos de la siguiente manera:
En PlaceholderFragment.java , he configurado onitemclicklistener
como:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_show_place, container, false);
final MySqliteHelper db = new MySqliteHelper(getActivity().getBaseContext());
listview_places = (ListView)rootView.findViewById(R.id.listView_places);
final PlacesAdapter places_adapter = new PlacesAdapter(getActivity(),R.layout.listview_item_row,places);
listview_places.setAdapter(places_adapter);
listview_places.setLongClickable(true);
listview_places.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position,long id) {
Place place = places_adapter.getItem(position);
String dbvaluename = place.getname();
Place selectedplace = db.getPlace(dbvaluename);
dblatitude = selectedplace.getlatitude();
dblongitude = selectedplace.getlongitude();
dbplacename = place.getname();
maps = new MapsFragment();
Bundle bundle = new Bundle();
bundle.putDouble("dbplacename",dblatitude);
bundle.putDouble("dbplacename",dblongitude);
bundle.putString("dbplacename",dbplacename);
maps.setArguments(bundle);
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.container_showplaces,maps);
ft.addToBackStack(null);
ft.commit();
}
});
}
}
y en MapsFragment.java , he mostrado los mapas como:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_maps, container, false);
try {
// Loading map
initilizeMap();
} catch (Exception e) {
e.printStackTrace();
}
return rootView;
}
Cuando hago clic por primera vez en el elemento de ListView, muestra el mapa ... Luego, cuando selecciono otro elemento, se bloquea:
Logcat log:
android.view.InflateException: archivo XML binario línea # 7: error al inflar el fragmento de clase en android.view.LayoutInflater.createViewFromTag (LayoutInflater.java:697) en android.view.LayoutInflater.rInflate (LayoutInflater.java:739) en android. view.LayoutInflater.inflate (LayoutInflater.java:489) en android.view.LayoutInflater.inflate (LayoutInflater.java:396) en com.krupal.rememberthisplace.MapsFragment.onCreateView (MapsFragment.java:40) en android.app.FragmentManagerImpl .moveToState (FragmentManager.java:828) en android.app.FragmentManagerImpl.moveToState (FragmentManager.java:1032) en android.app.BackStackRecord.run (BackStackRecord.java:622) en android.app.FragmentManagerImpl.execPendingActions (FragmentManager. java: 1382) en android.app.FragmentManagerImpl $ 1.run (FragmentManager.java:426) en android.os.Handler.handleCallback (Handler.java:605) en android.os.Handler.dispatchMessage (Handler.java:92) en android.os.Looper.loop (Looper.java:137) en android.app.ActivityThread.main (ActivityThread.java:44 24) en java.lang.reflect.Method.invokeNative (Método nativo) en java.lang.reflect.Method.invoke (Method.java:511) en com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit. java: 825) en com.android.internal.os.ZygoteInit.main (ZygoteInit.java:592) en dalvik.system.NativeStart.main (Método nativo) Causado por: java.lang.IllegalArgumentException: archivo XML binario línea # 7 : Duplicar id 0x7f0b001e, nulo de etiqueta o id principal 0xffffffff con otro fragmento para com.google.android.gms.maps.MapFragment en android.app.Activity.onCreateView (Activity.java:4248) en android.view.LayoutInflater.createViewFromTag (LayoutInflater.java:673) en android.view.LayoutInflater.rInflate (LayoutInflater.java:739) en android.view.LayoutInflater.inflate (LayoutInflater.java:489) en android.view.LayoutInflater.inflate (LayoutInflater.java: 396) en com.krupal.rememberthisplace.MapsFragment.onCreateView (MapsFragment.java:40) en android.app.FragmentManagerI mpl.moveToState (FragmentManager.java:828) en android.app.FragmentManagerImpl.moveToState (FragmentManager.java:1032) en android.app.BackStackRecord.run (BackStackRecord.java:622) en android.app.FragmentManagerImpl.execPendingActions (FragmentManager .java: 1382) en android.app.FragmentManagerImpl $ 1.run (FragmentManager.java:426) en android.os.Handler.handleCallback (Handler.java:605) en android.os.Handler.dispatchMessage (Handler.java:92 ) en android.os.Looper.loop (Looper.java:137) en android.app.ActivityThread.main (ActivityThread.java:4424) en java.lang.reflect.Method.invokeNative (Native Method) en java.lang. reflect.Method.invoke (Method.java:511) en com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:825) en com.android.internal.os.ZygoteInit.main (ZygoteInit.java: 592) en dalvik.system.NativeStart.main (Método nativo)
EDITAR: esta solución no funcionó para mí
¡Lo resolví ahora!
La otra solución es la respuesta vinculada funcionó bien para mí.
https://.com/a/14484640/3960528
Como se explica allí, agregué el onDestroyView()
en el `fragmento que contiene mapas.
@Override
public void onDestroyView() {
super.onDestroyView();
MapFragment f = (MapFragment) getFragmentManager()
.findFragmentById(R.id.mymap);
if (f != null)
getFragmentManager().beginTransaction().remove(f).commit();
}
¿Ha agregado esto en su archivo de manifiesto dentro de su etiqueta de aplicación?
<Application
...
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="API_KEY"/>
</Application>
Agregue los permisos correspondientes: https://developers.google.com/maps/documentation/android/start
Esto solucionó mi problema:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if(rootView==null){
rootView = inflater.inflate(R.layout.MapFragment, container, false);
}
return rootView;
}
Más aquí: https://colinyeoh.wordpress.com/2014/07/20/android-mapfragment-exception-when-clicked-twice/