2015-05-29 18 views
19

voglio impostare una mappa frammento di Google all'interno verticale ScrollView, quando faccio la mappa non zoom in verticale, come posso ignorare l'ascoltatore evento di tocco sul MapView sopra l'ascoltatore di ScrollView?come impostare google map frammento dentro vista di scorrimento

Questo è il mio codice XML:

<ScrollView android:layout_height="wrap_content" 
    android:layout_width="fill_parent" 
    android:layout_above="@id/footer" 
    android:layout_below="@id/title_horizontalScrollView"> 

    ///other things 



<fragment 
    android:id="@+id/map" 
    android:layout_width="fill_parent" 
    android:layout_height="300dp" 
    class="com.google.android.gms.maps.SupportMapFragment" 
    /> 

    //other things 
+0

controllare questa risposta :) http://stackoverflow.com/a/17317176/3215911 dovrebbe essere utile! – iroiroys

+0

ho aggiunto un'immagine trasparente ma non posso ancora ingrandire la vista mappa di google verticalmente – Malo

risposta

76

Creare un SupportMapFragmet personalizzato in modo che possiamo ignorare il suo evento di tocco:

Soluzione alternativaMapFragment.java

import android.content.Context; 
import android.os.Bundle; 
import android.widget.FrameLayout; 

import android.view.LayoutInflater; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.ViewGroup; 

import com.google.android.gms.maps.SupportMapFragment; 

public class WorkaroundMapFragment extends SupportMapFragment { 
    private OnTouchListener mListener; 

    @Override 
    public View onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle savedInstance) { 
     View layout = super.onCreateView(layoutInflater, viewGroup, savedInstance); 

     TouchableWrapper frameLayout = new TouchableWrapper(getActivity()); 

     frameLayout.setBackgroundColor(getResources().getColor(android.R.color.transparent)); 

     ((ViewGroup) layout).addView(frameLayout, 
       new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 

     return layout; 
    } 

    public void setListener(OnTouchListener listener) { 
     mListener = listener; 
    } 

    public interface OnTouchListener { 
     public abstract void onTouch(); 
    } 

    public class TouchableWrapper extends FrameLayout { 

     public TouchableWrapper(Context context) { 
      super(context); 
     } 

     @Override 
     public boolean dispatchTouchEvent(MotionEvent event) { 
      switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        mListener.onTouch(); 
        break; 
       case MotionEvent.ACTION_UP: 
        mListener.onTouch(); 
        break; 
      } 
      return super.dispatchTouchEvent(event); 
     } 
    } 
} 

In questa classe di cui sopra, abbiamo intercettare l'evento tocco utilizzando classe TouchableWrapper che estende il FrameLayout. Esiste anche un listener personalizzato OnTouchListener per inviare l'evento di tocco all'attività principale MyMapActivity che gestisce la mappa. Quando si verifica un evento touch, viene chiamato dispatchTouchEvent e il listener mListener lo gestirà.

Quindi sostituire classe frammento in XML con questo class="packagename.WorkaroundMapFragment" invece di com.google.android.gms.maps.SupportMapFragment

Poi nella vostra attività inizializzare mappa come segue:

private GoogleMap mMap; 

all'interno onCreate fare questo:

// check if we have got the googleMap already 
    if (mMap == null) { 
     mMap = ((WorkaroundMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); 
     mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
     mMap.getUiSettings().setZoomControlsEnabled(true); 
     mScrollView = (ScrollView) findViewById(R.id.scrollMap); //parent scrollview in xml, give your scrollview id value 

     ((WorkaroundMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)) 
       .setListener(new WorkaroundMapFragment.OnTouchListener() { 
        @Override 
        public void onTouch() { 
         mScrollView.requestDisallowInterceptTouchEvent(true); 
        } 
       }); 

    } 

} 
+1

OMG: D Its workinggg grazie mille sei il migliore – Malo

+1

@Malo sei il benvenuto :) –

+1

Funziona benissimo. Grazie. – AlbertoGarrido

-9

Come Android Document suggerito,
È possibile aggiungere come questo senso:

<ScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" > 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_weight="3" 
     android:orientation="horizontal" > 
<fragment 
     android:id="@+id/map" 
     android:name="com.google.android.gms.maps.SupportMapFragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     /> 
</LinearLayout> 
</ScrollView> 
+0

Inoltre non posso scorrere la mia mappa e zoomare verticalmente perché la vista di scorrimento scorre sulla mappa – Malo

+0

Spero che tu abbia fatto riferimento al documento menzionato. Non è una buona pratica mettere il frammento di mappa all'interno della scrollview. Per favore fammi sapere perché stai facendo così. Qualche ragione dietro a questo? Ho fatto la stessa cosa senza aggiungere in scrollview. Se vuoi vedere il codice, fammelo informare. –

+0

@RiteshGajera Cosa succede se hai una forma lunga e vuoi la mappa al centro di essa con tutte le funzionalità. Non usi la scrollview allora ?? –

12

Basta fare CustomScrollView.class,

public class CustomScrollView extends ScrollView { 

public CustomScrollView(Context context) { 
    super(context); 
} 

public CustomScrollView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public CustomScrollView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    final int action = ev.getAction(); 
    switch (action) { 
     case MotionEvent.ACTION_DOWN: 
      //Log.i("CustomScrollView", "onInterceptTouchEvent: DOWN super false"); 
      super.onTouchEvent(ev); 
      break; 

     case MotionEvent.ACTION_MOVE: 
      return false; // redirect MotionEvents to ourself 

     case MotionEvent.ACTION_CANCEL: 
      // Log.i("CustomScrollView", "onInterceptTouchEvent: CANCEL super false"); 
      super.onTouchEvent(ev); 
      break; 

     case MotionEvent.ACTION_UP: 
      //Log.i("CustomScrollView", "onInterceptTouchEvent: UP super false"); 
      return false; 

     default: 
      //Log.i("CustomScrollView", "onInterceptTouchEvent: " + action); 
      break; 
    } 

    return false; 
} 

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    super.onTouchEvent(ev); 
    //Log.i("CustomScrollView", "onTouchEvent. action: " + ev.getAction()); 
    return true; 
    } 
} 

Poi in xml

<com.app.ui.views.CustomScrollView 
    android:id="@+id/scrollView" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fillViewport="true" 
    android:orientation="vertical"> 
</com.app.ui.views.CustomScrollView> 

se xml beffore non ha funzionato modifica a questo ...

<com.myproyect.myapp.CustomScrollView 
     android:id="@+id/idScrollView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:fillViewport="true" 
     android:descendantFocusability="beforeDescendants" 
     > 
</com.myproyect.myapp.CustomScrollView> 

come usare programmaticaly

CustomScrollView myScrollView = (CustomScrollView) findViewById(R.id.idScrollView); 
+0

Questo ha risolto il mio problema per un MapView all'interno di una ScrollView (che si trovava in un frammento di un frammento di linguette swippable). In precedenza ho provato a eseguire l'override di onTouchEvent in MapView, senza successo. Mi hai salvato la giornata! –

+0

piace davvero questo. non devi scrivere la tua classe di mappa! –

+0

Soluzione fantastica. Non ho idea del perché funzioni. Qualcuno può spiegare? – steven

0

Il mio suggerimento è quello di utilizzare versione più leggera di google map quando si ha a che fare con questa situazione. questo ha risolto il mio problema.

aggiungere questo attributo in frammento.

map:liteMode="true" 

e il mio problema risolto. ho anche aggiunto customScrollView in aggiunta a questo. ma dopo aver inserito la proprietà liteMode il mio problema è stato risolto.

Problemi correlati