entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Android- Error. Mapa dentro de FragmentPagerAdapter y Fragment

Hola.

Tengo un FragmentPagerAdapter el cual contiene tres Fragment con distinta información. Para pasar de uno a otro simplemente se desliza el dedo de derecha a izquierda o izquierda a derecha.

En el primer Fragment recibo un error al instanciar el mapa. Si no lo instancio el mapa se infla siguiendo las indicaciones de su xml, pero necesito instanciarlo para insertar una posición.

infoinstalacion_fragment1.xml

    <?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <fragment
        android:id="@+id/infoinstalacion_fragment1_map"
        android:layout_width="310dp"
        android:layout_height="130dp"
        class="com.google.android.gms.maps.SupportMapFragment" >

    <TextView
        android:id="@+id/tvInfoF1nombre"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Nombre" >

</LinearLayout>
</android.support.v4.widget.DrawerLayout>

infoInstalacionFragment1.java

    @Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);

    //recogemos los datos de la Activity pricipal
    Bundle bundle = this.getArguments();
    instalacion = (Instalacion) getArguments().getSerializable("key");
    Log.e("LocAndroid", "Instalacion");

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    //Creamos la View
    View  view = inflater.inflate(R.layout.infoinstalacion_fragment1, container, false);
    mMap = ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map)).getMap();

    //retornaremos la View creada
    return view;

}

@Override
public void onStart() {
    // TODO Auto-generated method stub
    super.onStart();

    //Los insertamos en variables
    String nombre = instalacion.getNombre();
    String direccion = instalacion.getDireccion();
    String ciudad = instalacion.getCiudad();
    int telefono = instalacion.getTelefono();
    //instancioamos los TextView
    tvNombre = (TextView) getActivity().findViewById(R.id.tvInfoF1nombre);
    tvDireccion = (TextView) getActivity().findViewById(R.id.tvInfoF1direccion);
    tvCiudad = (TextView) getActivity().findViewById(R.id.tvInfoF1ciudad);
    tvTelefono = (TextView) getActivity().findViewById(R.id.tvInfoF1telefono);

    //setters
    tvNombre.setText(nombre);
    tvDireccion.setText(direccion);
    tvCiudad.setText(ciudad);
    tvTelefono.setText(Integer.toString(telefono));
    coorLatitud = instalacion.getCoorLatitud();
    coorLongitud = instalacion.getCoorLongitud();
    Log.e("Checking", "InfoInstalacionFragment1. Longitud: "+coorLongitud+" Latitud: "+coorLatitud);

}

Logcat:

03-04 15:03:20.188: E/AndroidRuntime(18881): FATAL EXCEPTION: main
03-04 15:03:20.188: E/AndroidRuntime(18881): Process: com.kirolm.instalacionesdep, PID: 18881
03-04 15:03:20.188: E/AndroidRuntime(18881): java.lang.NullPointerException
03-04 15:03:20.188: E/AndroidRuntime(18881):    at com.kirolm.instalacionesdep.info.InfoInstalacionFragment1.onCreateView(InfoInstalacionFragment1.java:85)
03-04 15:03:20.188: E/AndroidRuntime(18881):    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1786)
03-04 15:03:20.188: E/AndroidRuntime(18881):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947)
03-04 15:03:20.188: E/AndroidRuntime(18881):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
03-04 15:03:20.188: E/AndroidRuntime(18881):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
03-04 15:03:20.188: E/AndroidRuntime(18881):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)

El error esta en la siguiente linea pero no logro solucionarlo.

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

Muchas gracias.

1 Respuesta

2votos

egoitz_gonzalez Puntos10050

Solucionado.

La solución pasa por sustituir la siguiente linea:

mMap = ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map)).getMap()

Por esto:

    FragmentManager fm = getChildFragmentManager();
    mapFragment = (SupportMapFragment) fm.findFragmentById(R.id.infoinstalacion_fragment1_map);

    mapFragment.getMapAsync(new OnMapReadyCallback() {

        @Override
        public void onMapReady(GoogleMap googleMap) {
            // TODO Auto-generated method stub
            mMap = googleMap;
            mMap.addMarker(new MarkerOptions()
            .position(new LatLng(coorLatitud, coorLongitud))
            .title(nombre));

        }
    });

Se puede sustituir la función getMapASync por la siguiente linea:

mMap = mapFragment.getMap();

Pero según la documentación oficial esta última esta obsoleta

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta