Wie man Google Map Fragment innerhalb der Scroll-Ansicht festlegt

Ich möchte ein Google Map-Fragment in vertikalen ScrollView , wenn ich die Karte nicht genau senkrechte, wie kann ich den Touch-Event-Listener auf MapView über den Listener von ScrollView ?

Dies ist mein XML-Code:

  <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 

  • Wie man Marker die ganze Zeit von AsyncTask oder Handler in google map Version 2 zeigt
  • Konvertieren Sie GeoPoint in den Standort
  • Hinzufügen von Google Maps api v2 zu einem bestehenden Projekt
  • Google Map-Cluster mit Richtung
  • Wie man einen Ballon über einer Markierung in einer MapActivity zeigt? Gibt es kein Widget?
  • Ist die READ_GSERVICES-Berechtigung noch für Google Maps erforderlich?
  • So verwenden Sie mehrere MapActivities / MapViews pro Android-Anwendung / Prozess
  • SHA-1 Fingerabdruck des Keystore-Zertifikats
  • 4 Solutions collect form web for “Wie man Google Map Fragment innerhalb der Scroll-Ansicht festlegt”

    Erstellen Sie eine benutzerdefinierte SupportMapFragmet, damit wir sein Touch-Event überschreiben können:

    WorkaroundMapFragment.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 dieser oben genannten Klasse, fangen wir das Touch-Ereignis mit TouchableWrapper-Klasse, die die FrameLayout erweitert. Es gibt auch einen benutzerdefinierten Zuhörer OnTouchListener, um das Touch-Event an die Hauptaktivität MyMapActivity zu schicken, die die Karte verarbeitet. Wenn das Berührungsereignis aufgetreten ist, wird dispatchTouchEvent aufgerufen und der Zuhörer mListener wird damit umgehen.

    Ersetzen Sie dann die Fragmentklasse in xml mit dieser class="packagename.WorkaroundMapFragment" anstelle von com.google.android.gms.maps.SupportMapFragment

    Dann in Ihrer Aktivität Initialisierung Karte wie folgt:

     private GoogleMap mMap; 

    Inside onCreate tun dies:

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

    CustomScrollView.class einfach 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; } } 

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

    Wenn xml beffore nicht funktionieren …

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

    Wie man programmgesteuert benutzt

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

    Für diejenigen, wenn akzeptierte Antwort nicht funktioniert, aus irgendeinem Grund, Kasse eine andere Arbeitslösung:

    https://stackoverflow.com/a/17317176/989418

    Wie das Android-Dokument vorgeschlagen hat,
    Sie können so hinzufügen:

     <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> 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.