Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Google Map Fragment scrolling inside NestedScrollView

I am having a NestedScrollView as a parent and Fragment containing googleMap as its child. When Ever I scroll downwards or upwards in map the NesetdScrollView is scroll and I am unable to scroll inside the map. Till now I have tried a solution from stack overflow by creating a transparent Image but it didn't worked for me.

XML:

  <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/car_progress"
        android:id="@+id/nested_scroll"
        android:visibility="gone"

        >
............
............
<RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/first_section"
                android:visibility="gone"
                android:id="@+id/map_wrapper"
                android:orientation="vertical"
                android:layout_marginTop="10dp"
                >

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="@string/dealer_location"
                    android:textAllCaps="true"
                    android:textColor="@color/colorPrimary"
                    style="@style/BoldStyle"
                    android:layout_marginLeft="@dimen/single_title_dimen"
                    android:layout_marginRight="@dimen/single_title_dimen"
                    android:id="@+id/dealer_head"

                    />

                <fragment xmlns:android="http://schemas.android.com/apk/res/android"
                    xmlns:tools="http://schemas.android.com/tools"
                    android:layout_width="match_parent"
                    android:layout_height="200dp"
                    android:id="@+id/map"
                    android:name="com.google.android.gms.maps.SupportMapFragment"
                    android:layout_below="@+id/dealer_head"
                    />
                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/imagetrans"
                    android:layout_alignTop="@+id/map"
                    android:layout_alignBottom="@+id/map"
                    android:layout_alignEnd="@+id/map"
                    android:layout_alignRight="@+id/map"
                    android:layout_alignLeft="@+id/map"
                    android:layout_alignStart="@+id/map"
                    android:src="@android:color/transparent"/>

            </RelativeLayout>
.....
.....
 </android.support.v4.widget.NestedScrollView>

Code:

transImg.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.
                        nv.requestDisallowInterceptTouchEvent(true);
                        // Disable touch on transparent view
                        return false;

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

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

                    default:
                        return true;
                }
            }
        });
like image 416
Mehvish Ali Avatar asked Jan 17 '17 05:01

Mehvish Ali


1 Answers

Try this... use this custom map fragment with touchable wrapper.

MySupportMapFragment mSupportMapFragment;
mSupportMapFragment = (MySupportMapFragment) getChildFragmentManager().findFragmentById(R.id.googleMap);
if(mSupportMapFragment != null)
        mSupportMapFragment.setListener(new MySupportMapFragment.OnTouchListener() {
        @Override
        public void onTouch() {
            scrollView.requestDisallowInterceptTouchEvent(true);
        }
    });

MySupportMapFragment

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);
        }
    }
}
like image 90
Ashish John Avatar answered Nov 12 '22 18:11

Ashish John