2016-08-29 2 views
0

Ich habe ein Kartenfragment in einem vertikalen Scrollview. Ich möchte, dass es scrollbar ist. aber es funktioniert nicht. Ich habe versucht, ein transparentes Bild hinzufügen und auch die benutzerdefinierte Scroll aus diesen Antworten: how to set google map fragment inside scroll viewKarte in Bildlaufansicht nicht scrollbar

Google Maps API v2 SupportMapFragment inside ScrollView - users cannot scroll the map vertically

Meine Layout-Struktur:

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/scrollView" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context=".activities.TripDetailsActivity"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#ECF0F1" 
    android:orientation="vertical"> 

    <android.support.v7.widget.CardView 
     android:id="@+id/card_map" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_margin="10dp"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:background="@color/colorCard" 
      android:orientation="vertical" 
      android:weightSum="12"> 

      <TextView 
       android:id="@+id/tripTxt" 
       android:layout_width="match_parent" 
       android:layout_height="0dp" 
       android:layout_marginLeft="20dp" 
       android:layout_marginTop="20dp" 
       android:layout_marginBottom="5dp" 
       android:layout_weight="3" 
       android:text="Trip" 
       android:textColor="@color/colorTextCard" 
       android:textSize="20sp" /> 

      <fragment 
       android:id="@+id/map" 
       android:name="com.google.android.gms.maps.SupportMapFragment" 
       android:layout_width="match_parent" 
       android:layout_height="300dp" 
       android:layout_margin="10dp" 
       tools:context="com.example.keelindemo.Activities.Map" /> 

      <TextView 
       android:id="@+id/start_point" 
       android:layout_width="match_parent" 
       android:layout_height="0dp" 
       android:layout_marginLeft="10dp" 
       android:layout_weight="2" 
       android:drawableLeft="@drawable/flag_start" 
       android:drawablePadding="10dp" 
       android:gravity="center_vertical" 
       android:textColor="@color/colorTextCard" /> 

      <TextView 
       android:id="@+id/end_point" 
       android:layout_width="match_parent" 
       android:layout_height="0dp" 
       android:layout_marginBottom="10dp" 
       android:layout_marginLeft="10dp" 
       android:layout_marginTop="10dp" 
       android:layout_weight="2" 
       android:drawableLeft="@drawable/flag_end" 
       android:drawablePadding="10dp" 
       android:gravity="center_vertical" 
       android:textColor="@color/colorTextCard" /> 

     </LinearLayout> 

    </android.support.v7.widget.CardView> 

Bitte eine Lösung vorschlagen. Ich versuche alles auf Marshmallow.

+0

vorschlagen, versuchen Sie 'NestedScrollView' stattdessen - sie fügte einige nette Verbesserungen mit" verschachteltes Scrollen ", wie der Name suggeriert –

Antwort

1

können Sie scrollen google map in scrollview. siehe unten Link i beschreiben, wie Karte innerhalb Scrollview in Android blättern: http://newtech4you4ever.blogspot.in/2016/08/scroll-googlemap-in-scrollview-android.html

+0

Es arbeitet an allen Versionen einschließlich Marshmallow. –

+0

Ich habe es versucht, es wirft Nullzeiger Ausnahme in der benutzerdefinierten Klasse. public void setListener (OnTouchListener-Listener) { mlistener = Listener; } Diese Methode zeigt unbenutzt und daher null mListener –

+0

können Sie Interface OnTouchListener erstellen? –

0

Sie können einen Versuch auf dem folgenden Code geben und sehen, ob es für Sie arbeitet.

View customView = null; 
ScrollView scrollViewParent = null; 

scrollViewParent = (ScrollView) v.findViewById(R.id.scrollViewParent); 
customView = (View) v.findViewById(R.id.customView); 

customView.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     int action = event.getAction(); 
     switch (action) { 
     case MotionEvent.ACTION_DOWN: 
      // Disallow ScrollView to intercept touch events. 
      scrollViewParent.requestDisallowInterceptTouchEvent(true); 
      // Disable touch on transparent view 
      return false; 

     case MotionEvent.ACTION_UP: 
      // Allow ScrollView to intercept touch events. 
      scrollViewParent.requestDisallowInterceptTouchEvent(false); 
      return true; 

     case MotionEvent.ACTION_MOVE: 
      scrollViewParent.requestDisallowInterceptTouchEvent(true); 
      return false; 

     default: 
      return true; 
     } 
    } 
}); 

jetzt in XML-Datei

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/scrollViewParent" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 
     <fragment 
      android:id="@+id/map" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      class="com.google.android.gms.maps.SupportMapFragment" /> 

     <View 
      android:id="@+id/customView" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:background="@android:color/transparent" /> 
</ScrollView> 
+0

bereits versucht, funktioniert nicht –

0
public class MySupportMapFragment extends SupportMapFragment { 

    private OnTouchListener mListener; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { 

     View layout = super.onCreateView(inflater, parent, savedInstanceState); 
     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 Ihrer Aktivität/Fragment, fügen Sie den folgenden Code in onCreate/onViewCreated

ScrollView nScrollView = (ScrollView) findViewById(R.id.scrollViewParent); 
      MySupportMapFragment mSupportMapFragment; 
      mSupportMapFragment = (MySupportMapFragment) getChildFragmentManager().findFragmentById(R.id.googleMap); 

      mSupportMapFragment.setListener(new MySupportMapFragment.OnTouchListener() { 
         @Override 
         public void onTouch() { 
          mScrollView.requestDisallowInterceptTouchEvent(true); 
         } 
        }); 

      if (mSupportMapFragment != null) { 
       mSupportMapFragment.getMapAsync(new OnMapReadyCallback() { 
        @Override 
        public void onMapReady(GoogleMap googleMap) { 
         if (googleMap != null) { 
          googleMap.getUiSettings().setAllGesturesEnabled(true); 
          googleMap.getUiSettings().setZoomControlsEnabled(true); 
          LatLng marker_latlng = new LatLng(lat, lon); 
          CameraPosition cameraPosition = new CameraPosition.Builder().target(marker_latlng).zoom(15.0f).build(); 
          CameraUpdate cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition); 
          googleMap.moveCamera(cameraUpdate); 
          if (latitude != null && longitude != null) { 
            googleMap.addMarker(new MarkerOptions().position(marker_latlng).title("Address")); 
} 
         } 
        } 
       }); 
      } 

& Ihr Layout als diese

<fragment 
     android:id="@+id/googleMap" 
     class="com.yourpackagename.MySupportMapFragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
Verwandte Themen