Google Maps Fragment no se carga
Quiero cargar un objeto de Google Maps y crear algún oyente:
He creado esta clase:
- Java.lang.OutOfMemoryError en Android 5.0, causado por una asignación de 16k cuando 5M está disponible
- ¿Cómo mostrar diferentes diseños en recyclerView?
- GamesClient no se conecta. Error: "Llamar a connect () y esperar a que onConnected () sea llamado."
- Envío de un SMS en Android
- Cómo dibujar texto con diferentes trazos y colores de relleno?
import java.lang.ref.WeakReference; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.GoogleMap.OnMarkerDragListener; import com.google.android.gms.maps.MapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.FragmentActivity; import android.util.Log; import android.view.View; import android.view.ViewParent; import android.widget.ImageView; import android.widget.Toast; public class itemSaleActivity extends FragmentActivity { private static Context app; private static GoogleMap map; static final LatLng HAMBURG = new LatLng(53.558, 9.927); private static final int LOAD_COORD = 0; private ImageView pic; private LocationHandler mHandler; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Set View to register.xml setContentView(R.layout.itemsale); app = getApplicationContext(); Bundle extras = getIntent().getExtras(); byte[] byteArray = extras.getByteArray("picture"); Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length); pic = (ImageView) findViewById(R.id.itemImage); pic.setImageBitmap(bmp); map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); //Marker hamburg = map.addMarker(new MarkerOptions().position(HAMBURG).title("Hamburg")); mHandler = new LocationHandler(this); OnMarkerDragListener markerDragListener = new OnMarkerDragListener() { @Override public void onMarkerDragStart(Marker marker) { // Called when the marker drag is started } @Override public void onMarkerDragEnd(Marker marker) { // Called when the marker is dropped down. double[] coords = null; coords[0] = marker.getPosition().latitude; coords[1] = marker.getPosition().longitude; RestoreUIwithSavedLocation(coords); Toast.makeText(getApplicationContext(),"Pin Dropped at: " + coords[0] + ", " + coords[1]+marker.getTitle() , Toast.LENGTH_LONG).show(); } @Override public void onMarkerDrag(Marker marker) { } }; map.setOnMarkerDragListener(markerDragListener); View titleView = getWindow().findViewById(android.R.id.title); if (titleView != null) { ViewParent parent = titleView.getParent(); if (parent != null && (parent instanceof View)) { View parentView = (View)parent; parentView.setVisibility(View.GONE); } } // You can also assign the title programmatically by passing a // CharSequence or resource id. } private void RestoreUIwithSavedLocation(double[] coordsArray) { Message.obtain(mHandler, LOAD_COORD, coordsArray).sendToTarget(); } static class LocationHandler extends Handler { WeakReference<Activity> mActivity; public LocationHandler(Activity activity) { mActivity = new WeakReference<Activity>(activity); } public void handleMessage(Message msg) { Activity contextActivity = mActivity.get(); switch ((int)msg.what) { case LOAD_COORD: map.clear(); double[] coordArray = (double[])msg.obj; Marker marker = map.addMarker(new MarkerOptions().position(new LatLng(coordArray[0], coordArray[1]))); map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(coordArray[0], coordArray[1]), 18)); map.animateCamera(CameraUpdateFactory.zoomTo(18), 2000, null); marker.setDraggable(true); String s = Double.toString(coordArray[0]) + ", " + Double.toString(coordArray[1]); Toast.makeText(app,"in the case"+s , Toast.LENGTH_LONG).show(); break; } } } }
Y este es el XML:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <ImageView android:id="@+id/itemImage" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:src="@drawable/logo" /> <RelativeLayout android:layout_width="fill_parent" android:layout_height="400dp" android:layout_marginTop="10dp" android:layout_weight="66496.79" android:orientation="horizontal" > <fragment android:id="@+id/map" class="com.google.android.gms.maps.MapFragment" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_marginRight="150dp" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="170dp" android:orientation="vertical" > <Button android:id="@+id/messageBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:text="fffff" /> <Button android:id="@+id/call" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:text="ffff" /> <Button android:id="@+id/sms" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignRight="@+id/button1" android:layout_centerVertical="true" android:text="ffff" /> <Button android:id="@+id/email" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignRight="@+id/button1" android:layout_centerVertical="true" android:text="fffff" /> <Button android:id="@+id/navigate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/button1" android:layout_alignParentEnd="false" android:layout_alignParentStart="false" android:layout_below="@+id/button1" android:layout_marginTop="14dp" android:text="ffffffffff" /> </LinearLayout> </RelativeLayout> </LinearLayout>
Y cuando lo depura en mi teléfono (galaxia s2), me muestra una excepción:
03-29 15:24:29.750: E/AndroidRuntime(2579): FATAL EXCEPTION: main 03-29 15:24:29.750: E/AndroidRuntime(2579): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sal/com.example.sal.itemSaleActivity}: android.view.InflateException: Binary XML file line #26: Error inflating class fragment 03-29 15:24:29.750: E/AndroidRuntime(2579): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2079) 03-29 15:24:29.750: E/AndroidRuntime(2579): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104) 03-29 15:24:29.750: E/AndroidRuntime(2579): at android.app.ActivityThread.access$600(ActivityThread.java:132) 03-29 15:24:29.750: E/AndroidRuntime(2579): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1157) 03-29 15:24:29.750: E/AndroidRuntime(2579): at android.os.Handler.dispatchMessage(Handler.java:99) 03-29 15:24:29.750: E/AndroidRuntime(2579): at android.os.Looper.loop(Looper.java:137) 03-29 15:24:29.750: E/AndroidRuntime(2579): at android.app.ActivityThread.main(ActivityThread.java:4575) 03-29 15:24:29.750: E/AndroidRuntime(2579): at java.lang.reflect.Method.invokeNative(Native Method) 03-29 15:24:29.750: E/AndroidRuntime(2579): at java.lang.reflect.Method.invoke(Method.java:511) 03-29 15:24:29.750: E/AndroidRuntime(2579): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 03-29 15:24:29.750: E/AndroidRuntime(2579): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) 03-29 15:24:29.750: E/AndroidRuntime(2579): at dalvik.system.NativeStart.main(Native Method) 03-29 15:24:29.750: E/AndroidRuntime(2579): Caused by: android.view.InflateException: Binary XML file line #26: Error inflating class fragment 03-29 15:24:29.750: E/AndroidRuntime(2579): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:697) 03-29 15:24:29.750: E/AndroidRuntime(2579): at android.view.LayoutInflater.rInflate(LayoutInflater.java:739) 03-29 15:24:29.750: E/AndroidRuntime(2579): at android.view.LayoutInflater.rInflate(LayoutInflater.java:742) 03-29 15:24:29.750: E/AndroidRuntime(2579): at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 03-29 15:24:29.750: E/AndroidRuntime(2579): at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 03-29 15:24:29.750: E/AndroidRuntime(2579): at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 03-29 15:24:29.750: E/AndroidRuntime(2579): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:251) 03-29 15:24:29.750: E/AndroidRuntime(2579): at android.app.Activity.setContentView(Activity.java:1835) 03-29 15:24:29.750: E/AndroidRuntime(2579): at com.example.sal.itemSaleActivity.onCreate(itemSaleActivity.java:45) 03-29 15:24:29.750: E/AndroidRuntime(2579): at android.app.Activity.performCreate(Activity.java:4465) 03-29 15:24:29.750: E/AndroidRuntime(2579): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 03-29 15:24:29.750: E/AndroidRuntime(2579): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2033) 03-29 15:24:29.750: E/AndroidRuntime(2579): ... 11 more 03-29 15:24:29.750: E/AndroidRuntime(2579): Caused by: java.lang.ClassCastException: com.google.android.gms.maps.MapFragment cannot be cast to android.support.v4.app.Fragment 03-29 15:24:29.750: E/AndroidRuntime(2579): at android.support.v4.app.Fragment.instantiate(Fragment.java:388) 03-29 15:24:29.750: E/AndroidRuntime(2579): at android.support.v4.app.Fragment.instantiate(Fragment.java:363) 03-29 15:24:29.750: E/AndroidRuntime(2579): at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:264) 03-29 15:24:29.750: E/AndroidRuntime(2579): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:669) 03-29 15:24:29.750: E/AndroidRuntime(2579): ... 22 more
Donde la línea 26 en el archivo xml es:
<fragment android:id="@+id/map" class="com.google.android.gms.maps.MapFragment" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_marginRight="150dp" />
- Dagger 2 generó el componente de prueba no reconocido
- Instalación del complemento Genymotion Eclipse
- Utilizar el mismo fragmento varias veces en la misma actividad / diseño
- Android - botón de pantalla completa transparente
- Componente Dagger2 con más de una dependencia
- Subir varios archivos de Android a AppEngine en 1 solicitud
- El adaptador de vista de lista no funciona, getView no se llama.
- ¿Cómo imprimir desde la impresora térmica en Android?
En el archivo XML, use class="com.google.android.gms.maps.SupportMapFragment"
.
En su clase principal, utilice:
map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
En lugar de:
map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
Para agregar SupportMapFragment
a su proyecto, debe agregar google-support-v4
library y google map libraries
. Puedes leer acerca de cómo hacerlo en una entrada de blog que escribí, Google Maps API V2 .
FragmentActivity
es proporcionado por Android Support Library v4 para permitir que las plataformas Android antes de Android 3 (Honeycomb) usen fragmentos. Con Honeycomb y más tarde, los fragmentos son compatibles utilizando la clase de Activity
estándar
La captura es, dependiendo de la clase de actividad que elija, no puede utilizar la misma clase de fragmento:
- Con
android.support.v4.app.FragmentActivity
, tu musa usaandroid.support.v4.app.Fragment
- Con
android.app.Activity
, debe utilizarandroid.app.Fragment
Tenga en cuenta la diferencia de paquetes.
Ahora, con respecto a Google Maps v2 para Android, tiene dos implementaciones Fragment:
-
MapFragment
que extiendeandroid.app.Fragment
para Honeycomb y más tarde -
SupportMapFragment
que extiendeandroid.support.v4.app.Fragment
para soporte de versiones anteriores de Android
Por lo tanto, al utilizar FragmentActivity
, debe utilizar la implementación SupportMapFragment
para su aplicación.