2012-12-10 13 views
10

Sto cercando di integrare l'API di Google Maps per Android v2 nella mia applicazione Android. Sto posizionando la Google Map nel mezzo del mio layout. Funziona alla grande quando il layout è in grado di adattarsi allo schermo, ma quando il layout è troppo grande per adattarsi e l'utente scorre verso il basso per vedere il resto del contenuto, il resto del layout viene oscurato dalla mappa di Google. Vedere la seguente schermata:API Android di Google Maps V2 che oscura parte del layout

Screenshot of the issue

(Nota:. Tutte le mappa gesti sono disattivate per consentire all'utente di scorrere)

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

La mia configurazione mappa mia attività:

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

La mia impressione è che il frammento delle mappe n O come il ScrollView dal layout se è bello se l'intero layout si adatta allo schermo e lo scorrimento non è richiesto. La mappa stessa sembra essere la dimensione corretta. Il blackout è la dimensione esatta degli elementi rimanenti nella vista. Qualcuno ha qualche idea su come posso sbarazzarmi del blackout sotto la mappa così posso vedere il TextView sotto di esso? Tutto ciò che ho provato fino ad ora non ha funzionato.

risposta

3

Sono stato in grado di aggirare il problema con un hack. Ho esteso ScrollView così ho potuto ricevere notifiche sugli eventi di scorrimento. Ho usato l'implementazione ObservableScrollView da Synchronise ScrollView scroll positions - android.

ho aggiunto alla mia onCreate():

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

Poi, quando ricevo un evento cambiato di scorrimento, i Spostare la visibilità di tutta la visione, che impone una ri-layout che impedisce la scatola nera dall'apparire.

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

ho cercato di invalidare() la visualizzazione della mappa, e attivare o disattivare la visibilità del proprio guarda la mappa, ma nessuno dei due ha funzionato. Per fortuna, la commutazione dell'intera vista non causa alcuno sfarfallio o altri strani comportamenti.

Probabilmente c'è una soluzione migliore, ma a questo punto, questa è l'unica cosa che ho trovato che sembra funzionare.

+0

Davvero non c'è sfarfallio? Ho provato questa soluzione con SlidngMenu, ma non ha cambiato nulla. Vedi questo per i dettagli: http://stackoverflow.com/questions/14419521/moving-mapfragment-surfaceview-causes-black-background-flickering/14571989#comment20335526_14571989 –

+0

ho editTexts sotto mappa e ho usato questo, il testo di modifica successivamente perde focus, come potrei farlo, o c'è un altro modo? – JRowan

0

La mia ipotesi è che l'altezza di MapFragment è 0 durante l'inizializzazione dell'attività. Provate con

<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

Grazie per il suggerimento. Sfortunatamente, non ha funzionato. Ho ancora la barra nera, e lanugine sta lanciando questo avvertimento: questo RelativeLayout dovrebbe usare android: layout_height = "wrap_content". Altre idee? – meisteg

+0

Proprio come un esperimento - hai provato a mettere il TextView in questione sopra il frammento della mappa? Cosa succede quando lo fai? – DiscDev

+0

Ho provato a spostare il TextView. La barra nera appare ancora sotto la mappa, ma è più piccola poiché c'è meno layout (solo riempimento/margini del layout). – meisteg

0

solo un esperimento, ma avete provato ad aggiungere la TextView alla schermata di programmazione in setupMap() dopo che la mappa è già stato inizializzato?

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

ho potuto adattare quanto sopra per lo stesso problema in un Viewpager sovrascrivendo onPageScrolled nella 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); 
     } 
    } 
} 

Dove posizione 0 in Viewpager è un frammento che tiene un MapFragment e la posizione 1 è il frammento essere svenuto dopo la pergamena.

0

Un'altra possibilità è quella di utilizzare la funzione di nuovo GoogleMap.snapshot() e utilizzando una schermata della mappa invece come descritto here.

1

Soluzione: utilizzare il nuovo snapshot interface from GoogleMap e visualizzare un'istantanea della mappa durante lo scorrimento della pagina.

Ecco il mio codice per impostare l'istantanea (che è nello stesso frammento di carta, chiamata 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; 
    } 
} 

Dove "mapFragment" è il mio SupportedMapFragment e "IV" è un ImageView (fare è match_parent).

ed eccomi qui il controllo del rotolo:

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

mio frammento con mappa (FragmentMap) è in posizione 1, quindi ho bisogno di controll il libro dalla posizione di 0 a 1 e dalla posizione 1 a 2 (la prima clausola if). "getRegisteredFragment()" è una funzione del mio FragmentPagerAdapter personalizzato, in cui ho uno SparseArray (Fragment) chiamato "registeredFragments".

Quindi, ogni volta che si scorre verso o dalla mappa, si vede sempre un'istantanea di esso. Questo funziona molto bene per me.

Problemi correlati