2012-12-10 14 views
10

Próbuję zintegrować Google Maps Android API v2 z moją aplikacją Android. Umieszczam Mapę Google w środku mojego układu. Działa świetnie, gdy układ jest w stanie zmieścić się na ekranie, ale gdy układ jest zbyt duży, aby zmieścić się, a użytkownik przewija w dół, aby zobaczyć resztę zawartości, reszta układu jest zaciemniona przez Google Map. Zobacz poniższy zrzut ekranu:Google Maps Android API V2 zaciemnia część layoutu

Screenshot of the issue

(. UWAGA: Wszystkie gesty mapie są wyłączone, aby umożliwić użytkownikowi przewijanie)

Mój układ 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> 

Moja konfiguracja map w Moja aktywność:

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

Moje przeczucie jest fragment mapy robi n Podobnie jak ScrollView, ponieważ układ jest w porządku, jeśli cały układ mieści się na ekranie, a przewijanie nie jest wymagane. Sama mapa wydaje się mieć prawidłowy rozmiar. Blackout to dokładny rozmiar pozostałych elementów w widoku. Czy ktoś ma jakieś pomysły, jak mogę pozbyć się zaciemnienia pod mapą, więc widzę poniżej TextView? Wszystko, co do tej pory próbowałem, nie zadziałało.

Odpowiedz

3

Udało mi się obejść ten problem z hackerem. Rozszerzyłem ScrollView, dzięki czemu mogłem otrzymywać powiadomienia o zdarzeniach przewijania. Użyłem implementacji ObservableScrollView z Synchronise ScrollView scroll positions - android.

dodałem do mojego onCreate():

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

Potem, kiedy otrzymam zwój zmienił zdarzeń, przełączam widoczność całego widoku, co zmusza do ponownego układ, który zapobiega czarną skrzynkę od pojawienia się.

public void onScrollChanged(ObservableScrollView sv, int x, int y, int oldx, int oldy) { 
    sv.setVisibility(View.GONE); 
    sv.setVisibility(View.VISIBLE); 
} 

Starałem się unieważnić() widok mapy, a przełączanie widoczności tylko widoku mapy, ale nie działało. Na szczęście przełączenie widoczności całego widoku nie powoduje migotania ani innych dziwnych zachowań.

Prawdopodobnie jest lepszym rozwiązaniem, ale w tym momencie jest to jedyna rzecz, jaką okazało się, że wydaje się działać.

+0

Naprawdę brak migotania? Próbowałem tego rozwiązania z SlidngMenu, ale nic nie zmieniło. Zobacz szczegóły: http://stackoverflow.com/questions/14419521/moving-mapfragment-surfaceview-causes-black-background-flickering/14571989#comment20335526_14571989 –

+0

Mam editTexts pod mapą i użyłem tego, tekst do edycji tracę skupić się, jak mógłbym to zrobić, czy jest inny sposób? – JRowan

0

Przypuszczam, że wysokość odwzorowania mapy wynosi 0 podczas inicjowania działania. Spróbuj z

<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

Dzięki za sugestię. Niestety nie zadziałało. Nadal mam czarny pasek, a lint rzuca to ostrzeżenie: ten RelativeLayout powinien używać Androida: layout_height = "wrap_content". Jakieś inne pomysły? – meisteg

+0

Podobnie jak w przypadku eksperymentu - czy próbowałeś umieścić powyższy tekst powyżej fragmentu mapy? Co się dzieje, gdy to robisz? – DiscDev

+0

Próbowałem przenieść TextView. Czarny pasek nadal pojawia się pod mapą, ale jest mniejszy, ponieważ jest mniej układu (tylko dopełnienie/marginesy układu). – meisteg

0

tylko eksperyment, ale czy próbowała dodanie TextView do ekranu programowo w setupMap() po Mapa została już zainicjowana?

// 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

byłem w stanie dostosować się wyżej na tej samej kwestii w Viewpager nadrzędnymi onPageScrolled w FragmentPagerAdapter:

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

Jeżeli pozycja 0 w Viewpager jest fragmentem trzyma MapFragment i pozycję 1 jest fragment zgaśnięcie po przewinięciu.

0

Inną możliwością jest użycie funkcji nowy GoogleMap.snapshot() i za pomocą ekranu mapy zamiast jak opisano here.

1

Moje obejście: użyj nowego snapshot interface from GoogleMap i wyświetl migawkę mapy podczas przewijania strony.

Oto mój kod do ustawiania migawki (jest w tym samym fragmencie formie mapy, zwany 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; 
    } 
} 

Gdzie „mapFragment” jest moim SupportedMapFragment i „iv” jest ImageView (marka to match_parent).

i oto jestem kontrolowania przewiń:

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

Moja fragment z mapy (FragmentMap) znajduje się na pozycji 1, więc muszę Controll zwój z pozycji 0 do 1 i od pozycji 1 do 2 (pierwsza klauzula if). "getRegisteredFragment()" jest funkcją w moim niestandardowym FragmentPagerAdapter, w którym mam SparseArray (Fragment) o nazwie "registeredFragments".

Za każdym razem, gdy przewijasz mapę lub z niej, zawsze widzisz jej migawkę. Działa to bardzo dobrze dla mnie.

Powiązane problemy