ViewPager con la API de Google Maps v2: vista negra misteriosa

He integrado el nuevo google maps api v2 fragmento en un paginador de vista. Al desplazarse desde el fragmento de mapa, una vista en negro se superpone a los fragmentos adyacentes. Alguien ha resuelto?

Editar: captura de pantalla

Introduzca aquí la descripción de la imagen

public static class PagerAdapter extends FragmentPagerAdapter{ public PagerAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return NUM_ITEMS; } @Override public Fragment getItem(int position) { Fragment pageFragment; switch (position) { case 0: pageFragment = new TabAFragment(); break; case 1: pageFragment = new TabBFragment(); break; case 2: pageFragment = SupportMapFragment.newInstance(); break; default: pageFragment = null; break; } return pageFragment; } } 

Pude detener la superficie negra que quedaba tras la transición colocando otra vista con un fondo transparente encima del ViewPager dentro de un FrameLayout :

 <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v4.view.ViewPager android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" > </android.support.v4.view.ViewPager> <!-- hack to fix ugly black artefact with maps v2 --> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/transparent" /> </FrameLayout> 

Tenía el mismo problema con SlidingMenu y ViewPager. Me di cuenta de que los botones de control en el fragmento de mapa no son negros en el artefacto izquierdo detrás. He resuelto el problema por sobreescribir el método onCreateView() de MapFragment (SupportMapFragment)

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup view, Bundle savedInstance) { View layout = super.onCreateView(inflater, view, savedInstance); FrameLayout frameLayout = new FrameLayout(getActivity()); frameLayout.setBackgroundColor( getResources().getColor(android.R.color.transparent)); ((ViewGroup) layout).addView(frameLayout, new ViewGroup.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT ) ); return layout; } 

Google lanzó una corrección para esto, pero sólo para 4.1 + (no es necesario descargar una nueva versión de PlayServices, se utiliza un indicador de lado del servidor)

Esto es lo que estoy usando para evitar el problema – Asegura que no pierda ciclos de CPU en dispositivos> = 4.1

 public class FixMapFragment extends SupportMapFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = super.onCreateView(inflater, container, savedInstanceState); // Fix for black background on devices < 4.1 if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) { setMapTransparent((ViewGroup) view); } return view; } private void setMapTransparent(ViewGroup group) { int childCount = group.getChildCount(); for (int i = 0; i < childCount; i++) { View child = group.getChildAt(i); if (child instanceof ViewGroup) { setMapTransparent((ViewGroup) child); } else if (child instanceof SurfaceView) { child.setBackgroundColor(0x00000000); } } } } 

Mi solución: hacer uso de la nueva interfaz de instantánea de GoogleMap y mostrar una instantánea del mapa mientras se desplaza la página.

Aquí está mi código para configurar la instantánea (está en el mismo fragmento que el mapa, llamado FragmentMap.java):

 public void setSnapshot(int visibility) { switch(visibility) { case View.GONE: if(mapFragment.getView().getVisibility() == View.VISIBLE) { getMap().snapshot(new SnapshotReadyCallback() { @Override public void onSnapshotReady(Bitmap arg0) { iv.setImageBitmap(arg0); } }); iv.setVisibility(View.VISIBLE); mapFragment.getView().setVisibility(View.GONE); } break; case View.VISIBLE: if(mapFragment.getView().getVisibility() == View.GONE) { mapFragment.getView().setVisibility(View.VISIBLE); iv.setVisibility(View.GONE); } break; } } 

Donde "mapFragment" es mi SupportedMapFragment y "iv" es un ImageView (lo hace match_parent).

Y aquí estoy controlando el rollo:

 pager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if(position == 0 && positionOffsetPixels > 0 || position == 1 && positionOffsetPixels > 0) { ((FragmentMap)adapter.getRegisteredFragment(1)).setSnapshot(View.GONE); } else if(position == 1 && positionOffsetPixels == 0) { ((FragmentMap)adapter.getRegisteredFragment(1)).setSnapshot(View.VISIBLE); } } @Override public void onPageScrollStateChanged(int arg0) {} @Override public void onPageSelected(int arg0) {} }); 

Mi fragmento con el mapa (FragmentMap) está en la posición 1, así que necesito controlar el desplazamiento de la posición 0 a 1 y de la posición 1 a 2 (la primera si-cláusula). "GetRegisteredFragment ()" es una función en mi FragmentPagerAdapter personalizado, en el que tengo un SparseArray (Fragmento) llamado "registeredFragments".

Por lo tanto, siempre que desplácese hacia o desde su mapa, siempre verá una instantánea de la misma. Esto funciona muy bien para mí.

Tuve la misma cuestión de la pantalla negra en el desplazamiento de la vista de lista, estaba usando el mapa de fragmento con la vista de lista en la misma pantalla que he resuelto este problema con el uso de la propiedad mágica en xml donde estoy hablando ver lista sólo tenemos que poner android: ScrollingCache = "false". Mi problema está resuelto intente esta propiedad para detener el retraso y el parpadeo en sus mapas.

Usted no ha dado mucho detalle por lo que sólo hay mucho que puedo sugerir. Tuve un problema similar que la pantalla parpadeó entre las vistas en el buscapersonas. Resultó ser el mapView que se inflaba al intercambiar entre páginas la primera vez.

Para ser claro tenía 3 páginas en mi buscapersonas y mi mapa era la última página.

Para solucionar esto encontré que el ajuste del número de páginas de pantalla a 2 (esto funcionó en el caso anterior) que cuando mi fragmento comenzó cargó todas las vistas a la vez.

Consulte http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit (int)

Hay una solución más a este problema. Estoy mostrando MapFragment dentro de otro fragmento. El MapFragment se agrega dinámicamente a un FrameLayout.

La solución es usar frameLayout.setVisibility (View.Visible) y frameLayout.setVisibility (View.Gone) en abrir y cerrar eventos del menú deslizante. Se dosent requieren una vista adicional para ser añadido. Y el área negra se ha ido completamente.

 getSlidingMenu().setOnOpenListener( new OnOpenListener() { @Override public void onOpen() { frameLayout.setVisibility(View.GONE); } }); getSlidingMenu().setOnClosedListener( new OnClosedListener() { @Override public void onClosed() { frameLayout.setVisibility(View.VISIBLE); } }); 

Ninguno de los métodos anteriores funcionó para mí, ni siquiera otros que he encontrado en otro lugar. Finalmente, elegí una solución parcial. Escucho los cambios de página a través del onPageChangeListener de ViewPager, y ocultar el mapa cuando su página comienza a desplazarse, y también lo muestro de nuevo cuando detiene el desplazamiento. También he agregado una vista blanca para ser exhibida al desplazar.

Simplemente copie mi fragmento de mapa personalizado en su proyecto. Y si tienes líneas negras con ScrollView en la parte superior e inferior ajustadas a tu ScrollView android: fadingEdge = "none"

 public class CustomMapFragment extends SupportMapFragment { private OnActivityCreatedListener onActivityCreatedListener; public CustomMapFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup view, Bundle savedInstance) { View layout = super.onCreateView(inflater, view, savedInstance); FrameLayout frameLayout = new FrameLayout(getActivity()); frameLayout.setBackgroundColor(getResources().getColor(android.R.color.transparent)); ((ViewGroup) layout).addView(frameLayout, new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); return layout; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (getOnActivityCreatedListener() != null) getOnActivityCreatedListener().onCreated(); } public OnActivityCreatedListener getOnActivityCreatedListener() { return onActivityCreatedListener; } public void setOnActivityCreatedListener( OnActivityCreatedListener onActivityCreatedListener) { this.onActivityCreatedListener = onActivityCreatedListener; } public interface OnActivityCreatedListener { void onCreated(); } 

}

  • retroceder de un viewpager hace que la aplicación se bloquee
  • Error al obtener el error msg install failed missing shared library
  • Cómo utilizar SupportMapFragment dentro de un fragmento?
  • La intención de Android para abrir tanto Waze como los mapas de Google
  • Geocode no funciona - Genymotion
  • Entender boundCenterBottom ()
  • Google Maps V2 muestra pantalla en blanco en Android 2.2
  • Google Map no se muestra en la actividad de la pestaña
  • Principales diferencias entre el uso de Google Maps Javascript API v3 y Android MapView
  • Después de eliminar los eventos de tapa de OverlayItem todavía activan
  • ListView de Android con mapas de Google
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.