android google-maps android-viewpager

android - ViewPager con Google Maps API v2: misteriosa vista en negro



google-maps android-viewpager (9)

Google lanzó una solución para esto, pero solo para 4.1+ (No necesita descargar una nueva versión de PlayServices, usaron una bandera del lado del servidor)

Esto es lo que estoy usando para eludir el problema: garantiza que no desperdicie ningún ciclo 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); } } } }

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

Editar: captura de pantalla

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; } }


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) al abrir y cerrar eventos del menú deslizante. Dosent requiere una vista adicional para ser agregado. Y el área negra se ha ido por completo.

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


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

Aquí está mi código para establecer 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 (haz que match_parent).

Y aquí estoy controlando el pergamino:

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 mapa (FragmentMap) está en la posición 1, así que necesito controlar el desplazamiento desde la posición 0 a 1 y desde la posición 1 a 2 (la primera cláusula if). "getRegisteredFragment ()" es una función en mi FragmentPagerAdapter personalizado, en el que tengo un SparseArray (Fragment) llamado "registeredFragments".

Entonces, cada vez que te desplazas hacia o desde tu mapa, siempre ves una instantánea de él. Este trabajo es muy bueno para mi.


Ninguno de los métodos anteriores funcionó para mí, ni siquiera otros que he encontrado en otros lugares. Finalmente, elegí una solución parcial. Escucho los cambios de página a través de onPageChangeListener de ViewPager, y oculto el mapa cuando su página comienza a desplazarse, y asimismo lo vuelvo a mostrar cuando deja de desplazarse. También he agregado una vista blanca para mostrar cuando se desplaza.


No has dado muchos detalles, así que solo puedo sugerirte mucho. Tuve un problema similar que la pantalla parpadeaba entre las vistas en el localizador. Resultó ser el mapView inflando al intercambiar páginas la primera vez.

Para ser claros, tenía 3 páginas en mi busca y mi mapa era la última página.

Para resolver esto encontré que estableciendo el número de páginas fuera de pantalla en 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)


Pude detener la superficie negra que quedaba después de la transición al colocar otra vista con un fondo transparente encima de ViewPager dentro de 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>


Solo copie mi fragmento de mapa personalizado a su proyecto. Y si tiene líneas negras con ScrollView en la parte superior e inferior configuradas en su 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(); }

}


Tuve el mismo problema con SlidingMenu y ViewPager. Noté que los botones de control en el fragmento del mapa no son negros en el artefacto dejado atrás. onCreateView() el problema anulando 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; }


Tuve el mismo problema de pantalla negra al desplazarme de la vista de lista, estaba usando un fragmento de mapa con vista de lista en la misma pantalla, he resuelto este problema con el uso de la propiedad mágica en xml, donde estoy hablando de lista, solo tenemos que poner android: scrollingCache = "false". Mi problema está solucionado. Prueba esta propiedad para detener el retraso y el parpadeo en tus mapas.