The Bat
The Bat

Reputation: 1115

Map inside scrollview not scrollable

I have a map fragment inside a vertical scrollview. I want it to be scrollable. but it is not working. I have tried adding a transparent image and also the custom Scrollview from these answers: how to set google map fragment inside scroll view

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

My layout structure:

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

Please suggest some solution. I am trying everything on Marshmallow.

Upvotes: 1

Views: 5406

Answers (2)

Ashish John
Ashish John

Reputation: 1905

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 Your activity/fragment, add the following 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"));
}
                        }
                    }
                });
            }

& your layout as this

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

Upvotes: 1

Hardik Vaghasiya
Hardik Vaghasiya

Reputation: 298

you can scroll google map inside scrollview. see below link i describe how to scroll map inside scrollview in android: http://newtech4you4ever.blogspot.in/2016/08/scroll-googlemap-in-scrollview-android.html

Upvotes: 3

Related Questions