2012-12-10 9 views
10

Ich versuche, Google Maps Android API v2 in meine Android-Anwendung zu integrieren. Ich platziere die Google Map in der Mitte meines Layouts. Es funktioniert hervorragend, wenn das Layout auf den Bildschirm passt. Wenn das Layout jedoch zu groß ist und der Benutzer nach unten scrollt, um den Rest des Inhalts anzuzeigen, wird der Rest des Layouts von Google Map ausgeblendet. Siehe die folgende Screenshot:Google Maps Android API V2 Blackout Teil des Layouts

Screenshot of the issue

(Anmerkung:. Alle Karten Gesten sind deaktiviert, damit der Benutzer blättern)

Mein Layout XML:

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:scrollbars="vertical" 
android:fillViewport="true" > 

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:padding="20sp" > 

    <TextView 
     android:id="@+id/race_num" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="14sp" 
     android:textSize="@dimen/DetailsTop" 
     android:layout_alignParentLeft="true" 
     android:layout_toLeftOf="@+id/race_in_chase" /> 
    <TextView 
     android:id="@id/race_in_chase" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/in_the_chase" 
     android:textSize="@dimen/DetailsTop" 
     android:background="@drawable/inthechase" 
     android:paddingLeft="20sp" 
     android:paddingRight="20sp" 
     android:visibility="gone" 
     android:layout_alignParentRight="true" /> 

    <TextView 
     android:id="@+id/race_name" 
     style="@style/RaceDetailsName" 
     android:layout_below="@id/race_num" /> 
    <TextView 
     android:id="@+id/race_track" 
     style="@style/RaceDetailsText" 
     android:paddingBottom="20sp" 
     android:layout_below="@id/race_name" /> 

    <TextView 
     android:id="@+id/race_time" 
     style="@style/RaceDetailsText" 
     android:layout_below="@id/race_track" /> 
    <TextView 
     android:id="@+id/race_tv" 
     style="@style/RaceDetailsText" 
     android:layout_below="@id/race_time" /> 

    <fragment 
     android:id="@+id/map" 
     android:layout_width="match_parent" 
     android:layout_height="380dp" 
     android:layout_marginTop="20sp" 
     android:layout_marginBottom="20sp" 
     class="com.google.android.gms.maps.SupportMapFragment" 
     android:layout_below="@id/race_tv" /> 

    <TextView 
     android:id="@+id/race_track_size" 
     style="@style/RaceDetailsText" 
     android:layout_below="@id/map" /> 

</RelativeLayout> 

</ScrollView> 

Meine Karte Setup in meine Aktivität:

private void setUpMapIfNeeded() { 
    if (mMap == null) { 
     mMap = ((SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map)).getMap(); 
     if (mMap != null) { 
      setUpMap(); 
     } 
    } 
} 

private static final LatLng CHICAGOLAND = new LatLng(41.474856, -88.056928); 

private void setUpMap() { 
    mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE); 
    mMap.getUiSettings().setZoomControlsEnabled(false); 
    mMap.getUiSettings().setAllGesturesEnabled(false); 
    CameraPosition cameraPosition = new CameraPosition.Builder() 
     .target(CHICAGOLAND) 
     .zoom(14.5f) 
     .bearing(53) 
     .build(); 
    mMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 
} 

Meine Ahnung ist das Kartenfragment tut n ot wie die ScrollView, da das Layout in Ordnung ist, wenn das gesamte Layout auf den Bildschirm passt und das Scrollen nicht erforderlich ist. Die Karte selbst scheint die richtige Größe zu haben. Der Blackout ist die genaue Größe der verbleibenden Elemente in der Ansicht. Hat jemand irgendwelche Ideen, wie ich den Blackout unter der Karte loswerden kann, damit ich den TextView darunter sehen kann? Alles, was ich bis jetzt versucht habe, hat nicht funktioniert.

Antwort

3

Ich konnte das Problem mit einem Hack umgehen. Ich habe ScrollView erweitert, damit ich bei Scroll-Ereignissen benachrichtigt werden kann. Ich habe die ObservableScrollView-Implementierung von Synchronise ScrollView scroll positions - android verwendet.

Ich habe zu meinem onCreate():

ObservableScrollView sv = (ObservableScrollView) findViewById(R.id.scroll); 
sv.setScrollViewListener(this); 

Dann, wenn ich eine Rolle geändert Ereignis empfangen, ich die Sichtbarkeit der gesamten Ansicht wechseln, die ein Re-Layout erzwingt, die die Blackbox verhindert vom Erscheinen.

Ich habe versucht,() die Kartenansicht ungültig zu machen, und die Sichtbarkeit nur der Kartenansicht umgeschaltet, aber keiner funktionierte. Zum Glück verursacht das Umschalten der Sichtbarkeit der gesamten Ansicht kein Flimmern oder anderes seltsames Verhalten.

Es gibt wahrscheinlich eine bessere Lösung, aber an diesem Punkt scheint das einzige, was ich gefunden habe, zu funktionieren.

+0

Wirklich kein Flimmern? Ich habe diese Lösung mit SlidngMenu versucht, aber das hat nichts geändert. Sehen Sie das für Details: http://Stackoverflow.com/questions/14419521/moving-mapfragment-surfaceview-causes-black-background-flickering/14571989#comment20335526_14571989 –

+0

Ich habe editTexts unter Karte und ich benutzte dieses, der redigierte Text verliert als nächstes Fokus, wie könnte ich das tun, oder gibt es einen anderen Weg? – JRowan

0

Meine Schätzung ist die Höhe der MapFragment ist 0 während der Initialisierung der Aktivität. Versuchen Sie, mit

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:padding="20sp" > 

.... 

     <TextView 
      android:id="@+id/race_track_size" 
      style="@style/RaceDetailsText" 
      android:layout_alignParentBottom="true" 
      android:layout_marginBottom="2dp"/> 

</RelativeLayout> 
+0

Danke für Ihren Vorschlag. Leider hat es nicht funktioniert. Ich habe immer noch die schwarze Leiste, und Lint wirft diese Warnung: Diese RelativeLayout sollte Android: layout_height = "wrap_content" verwenden. Irgendwelche anderen Ideen? – meisteg

+0

Nur als Experiment - haben Sie versucht, die in Frage stehende TextView über das Kartenfragment zu setzen? Was passiert, wenn Sie das tun? – DiscDev

+0

Ich habe versucht, die TextView zu bewegen. Der schwarze Balken wird immer noch unter der Karte angezeigt, aber er ist kleiner, da weniger Layout vorhanden ist (nur Layout-Abstände/Ränder). – meisteg

0

nur ein Experiment, aber haben Sie versucht, das Textview auf dem Bildschirm programmatisch in setupMap Hinzufügen(), nachdem die Karte bereits initialisiert wurde?

// First, get a handle on the parent RelativeLayout, 
// call it parentRelativeLayout, then…     

TextView textView = new TextView(getActivity()); 
RelativeLayout.LayoutParams textLayout = new RelativeLayout.LayoutParams(
    RelativeLayout.MATCH_PARENT, 
    RelativeLayout.MATCH_PARENT 
); 
textLayout.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, -1); 
textView.setLayoutParams(textLayout); 

parentRelativeLayout.addView(textView) 
1

konnte ich die oben für das gleiche Problem in einem Viewpager von onPageScrolled im FragmentPagerAdapter zwingenden anzupassen: 1

@Override 
public void onPageScrolled(int position, float positionOffset, 
          int positionOffsetPixels) { 
    if ((position == 0 && positionOffsetPixels > 0) || 
     (position == 1 && positionOffsetPixels == 0)) { 
     MyFragment blackedOutFragment = (MyFragment) getSupportFragmentManager() 
       .findFragmentByTag("android:switcher:" + R.id.pager + ":1"); 
     if (blackedOutFragment != null) { 
      blackedOutFragment.getView().setVisibility(View.GONE); 
      blackedOutFragment.getView().setVisibility(View.VISIBLE); 
     } 
    } 
} 

Wo Position 0 im Viewpager ist ein Fragment, die eine MapFragment und Position ist das Fragment nach der Schriftrolle verdunkelt werden.Dies sollte es beheben

0

Eine andere Möglichkeit ist es, die neue GoogleMap.snapshot() Funktion und mit einem Screenshot der Karte zu verwenden, anstatt wie here beschrieben.

1

Meine Problemumgehung: Verwenden Sie die neue snapshot interface from GoogleMap und zeigen Sie einen Snapshot der Karte beim Scrollen der Seite.

Hier ist mein Code den Schnappschuss (es ist in der gleichen Fragment als Karte, genannt FragmentMap.java) zu setzen:

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" my SupportedMapFragment ist und "iv" ist eine Image (machen es match_parent).

Und hier bin ich Steuerung der Scroll:

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 0 die Schriftrolle von Position kontrollieren: 1 und von Position 1 bis 2 (die erste if-Klausel). "getRegisteredFragment()" ist eine Funktion in meinem benutzerdefinierten FragmentPagerAdapter, in der ich ein SparseArray (Fragment) namens "registredFragments" habe.

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

Verwandte Themen