2015-05-29 9 views
19

Ich möchte ein Google-Kartenfragment innerhalb der vertikalen ScrollView setzen, wenn ich die Karte nicht vertikal zoomen, wie kann ich den Touch-Ereignis-Listener auf über den Hörer von ScrollView überschreiben?Wie setze ich Google Map Fragment in Bildlaufansicht

Das 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 
+0

prüfen diese Antwort :) http://stackoverflow.com/a/17317176/3215911 sollte es hilfreich sein! – iroiroys

+0

ich fügte transparentes Bild hinzu aber konnte noch nicht die google Kartenansicht vertikal – Malo

Antwort

76

eine benutzerdefinierte SupportMapFragmet erstellen, damit wir sein Berührungsereignis außer Kraft setzen können:

WorkaroundMapFragment.java

In dieser Klasse fangen wir das Berührungsereignis mit der Klasse TouchableWrapper ab, die das FrameLayout erweitert. Es gibt auch einen benutzerdefinierten Listener OnTouchListener, um das Berührungsereignis an die Hauptaktivität MyMapActivity zu senden, die die Karte verarbeitet. Wenn ein Berührungsereignis aufgetreten ist, wird dispatchTouchEvent aufgerufen und der Listener mListener wird damit umgehen.

Dann Fragment Klasse in XML mit diesem class="packagename.WorkaroundMapFragment" statt ersetzen von com.google.android.gms.maps.SupportMapFragment

Dann in Ihrer Tätigkeit Karte initialisieren wie folgt:

private GoogleMap mMap; 

innen onCreate dies zu tun:

// 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 Seine Workinggg vielen Dank, du bist der Beste – Malo

+1

@Malo du bist willkommen :) –

+1

Es funktioniert super. Vielen Dank. – AlbertoGarrido

-9

Als Android Document vorgeschlagen,
Sie mögen diese Art und Weise 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> 
+0

zoomen Auch kann ich nicht meine Karte scrollen und vertikal zoomen, weil die Scrollansicht über die Karte scroll – Malo

+0

Ich hoffe, dass Sie das erwähnte Dokument verwiesen haben. Es ist nicht empfehlenswert, das Kartenfragment in die Scrollview zu stellen. Bitte lassen Sie mich wissen, warum tun Sie so. Irgendein Grund dahinter? Ich habe dasselbe getan, ohne in Scrollview hinzuzufügen. Wenn Sie sich den Code ansehen möchten, lassen Sie es mich informieren. –

+0

@RiteshGajera Was ist, wenn Sie eine lange Form haben und Karte in der Mitte mit allen Funktionalitäten erstellen möchten. Verwenden Sie nicht scrollview dann? –

12

einfach machen 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 ändern funktioniert hat dies ...

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

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

Das löste mein Problem für eine MapView in einer ScrollView (die sich in einem Fragment eines überspringbaren Tabs befand). Ich habe zuvor versucht, onTouchEvent in MapView zu überschreiben, ohne Erfolg. Du hast meinen Tag gerettet! –

+0

wirklich wie dieser. Sie müssen nicht Ihre eigene Kartenklasse schreiben! –

+0

Fantastische Lösung. Ich habe keine Ahnung, warum es funktioniert. Kann jemand das erklären? – steven

0

Mein Vorschlag ist, zu verwenden, leichtere Version von Google Map im Umgang mit dieser Situation. Das hat mein Problem gelöst.

Fügen Sie dieses Attribut im Fragment hinzu.

map:liteMode="true" 

und mein Problem gelöst. Ich habe auch customScrollView zusätzlich hinzugefügt. Aber nach dem Platzieren der liteMode-Eigenschaft wurde mein Problem behoben.

Verwandte Themen