ViewPager mit Google Maps API v2: geheimnisvolle schwarze Ansicht

Ich habe die neue Google Maps Api V2 Fragment in einem View Pager integriert. Beim Scrollen aus dem Kartenfragment überlappt eine schwarze Ansicht die angrenzenden Fragmente. Jemand hat gelöst?

Bearbeiten: screenshot

  • Android-Animation stoppt, wenn Ansicht aus dem Bildschirm
  • Android: Wie aktualisiere ich ListView?
  • Wie kann ich android.os.NetworkOnMainThreadException reparieren?
  • Android: Wie zu wissen, Datei in Web-Server befindet sich geändert?
  • Der Schlüssel muss eine anwendungsspezifische Ressource-ID sein
  • OnCreate flow geht nach fertig ()
  • Bildbeschreibung hier eingeben

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

  • Grenzlinien für Zellen in GridLayout, TableLayout oder GridView?
  • OnClickListener funktioniert nicht für das erste Element in GridView
  • PopupWindow $ BadTokenException: Kann nicht hinzufügen Fenster - Token Null ist nicht gültig
  • Wie kann ich den Trefferbereich des Android-Knopfes erhöhen, ohne den Hintergrund zu skalieren?
  • Lesen aller heutigen Veranstaltungen mit CalendarContract - Android 4.0+
  • Wie bekommst du Kontakte, um richtig zu aggregieren, wenn sie programmgesteuert hinzufügen?
  • 9 Solutions collect form web for “ViewPager mit Google Maps API v2: geheimnisvolle schwarze Ansicht”

    Ich konnte in der Lage sein, die schwarze Oberfläche zu stoppen, die nach dem Übergang zurückgelassen wurde, indem sie eine andere Ansicht mit einem transparenten Hintergrund auf den ViewPager in einem 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> 

    Hatte das gleiche Problem mit SlidingMenu und ViewPager. Ich bemerkte, dass die Steuertasten im Kartenfragment nicht schwarz hinter dem Artefakt sind. Ich habe das Problem gelöst, indem ich die onCreateView() Methode von 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 veröffentlichte ein Update für diese, aber nur für 4.1+ (Du brauchst keine neue Version von PlayServices herunterzuladen, sie haben eine Server-Side-Flag)

    Hier ist, was ich bin, um das Problem zu umgehen – Stellt sicher, dass Sie keine CPU-Zyklen auf Geräten verschwenden> = 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); } } } } 

    Mein Workaround: Nutzen Sie die neue Snapshot-Schnittstelle von GoogleMap und zeigen Sie einen Schnappschuss der Karte beim Scrollen der Seite an.

    Hier ist mein Code, um den Snapshot zu setzen (es ist im selben Fragment wie Karte, genannt 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; } } 

    Wo "mapFragment" ist mein SupportedMapFragment und "iv" ist ein ImageView (make it match_parent).

    Und hier kontrolliere ich die Schriftrolle:

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

    Mein Fragment mit Karte (FragmentMap) ist auf Position 1, also muss ich den Scroll von Position 0 auf 1 und von Position 1 auf 2 (die erste if-Klausel) steuern. "GetRegisteredFragment ()" ist eine Funktion in meinem benutzerdefinierten FragmentPagerAdapter, in der ich ein SparseArray (Fragment) namens "registriertFragments" habe.

    Also, wann immer Sie zu oder von Ihrer Karte blättern, sehen Sie immer einen Schnappschuss davon. Das funktioniert sehr gut für mich.

    Ich hatte das gleiche Problem des schwarzen Bildschirms auf das Scrollen der Listenansicht, ich war mit Kartenfragment mit Listenansicht im selben Bildschirm Ich habe dieses Problem mit der Verwendung der magischen Eigenschaft in xml, wo ich rede Listenansicht nur wir haben, um Android zu setzen : ScrollingCache = "false" .my Problem ist behoben versuchen diese Eigenschaft zu stoppen Verzögerung und Flimmern in Ihren Karten.

    Sie haben nicht viel Detail gegeben, also gibt es nur so viel kann ich vorschlagen. Ich hatte ein ähnliches Problem, dass der Bildschirm zwischen den Ansichten im Pager flackerte. Es stellte sich heraus, dass die MapView Aufblasen, wenn Swapping zwischen Seiten das erste Mal.

    Um klar zu sein, hatte ich 3 Seiten in meinem Pager und meine Karte war die letzte Seite.

    Um dies zu lösen, fand ich, dass die Anzahl der Off-Screen-Seiten auf 2 (dies funktionierte im obigen Fall), dass, wenn mein Fragment begann es alle Ansichten auf einmal geladen.

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

    Es gibt noch eine Lösung für dieses Problem. Ich zeige MapFragment in einem anderen Fragment. Das MapFragment wird dynamisch in das FrameLayout hinzugefügt.

    Die Lösung besteht darin, frameLayout.setVisibility (View.Visible) und frameLayout.setVisibility (View.Gone) auf offenen und geschlossenen Ereignissen des Sliding-Menüs zu verwenden. Es dosent erfordert eine zusätzliche Ansicht hinzugefügt werden. Und der schwarze Bereich ist ganz verschwunden.

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

    Keiner der oben genannten Methoden hat für mich gearbeitet, nicht einmal andere, die ich woanders gefunden habe. Schließlich wählte ich eine Teillösung. Ich höre auf Seitenänderungen über den OnPageChangeListener des ViewPagers und verstecke die Karte, wenn die Seite mit dem Scrollen beginnt, und zeigt sie auch wieder an, wenn sie das Scrollen stoppt. Ich habe auch eine weiße Ansicht hinzugefügt, die beim Scrollen angezeigt wird.

    Kopiere einfach mein kundenspezifisches Kartenfragment in dein Projekt. Und wenn Sie schwarze Linien mit ScrollView auf der Oberseite und unten haben, setzen Sie auf Ihren 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(); } 

    }

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.