how to set google map fragment inside scroll view

后端 未结 8 969
北海茫月
北海茫月 2020-11-29 00:00

I want to set a Google map fragment inside vertical ScrollView, when I do the map does not zoom vertically, how can I override the touch event listener on

8条回答
  •  情话喂你
    2020-11-29 00:11

    Create a custom SupportMapFragment so that we can override its touch event:

    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 this above class, we intercept the touch event by using TouchableWrapper.class that extends the FrameLayout. There is also a custom listener OnTouchListener to dispatch the touch event to the main activity named MyMapActivity that handles the map. When the touch event occurred, dispatchTouchEvent will be called and the listener mListener will handle it.

    Then replace fragment class in xml with this class="packagename.WorkaroundMapFragment" instead of com.google.android.gms.maps.SupportMapFragment

    Then in your activity initialize map as follows:

    private GoogleMap mMap;
    

    inside onCreate do this:

      // check if we have got the googleMap already
      if (mMap == null) {
            SupportMapFragment mapFragment = (WorkaroundMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
            mapFragment.getMapAsync(new OnMapReadyCallback() {
                Override
                    public void onMapReady(GoogleMap googleMap)
                        {
                            mMap = googleMap;
                            mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
                            mMap.getUiSettings().setZoomControlsEnabled(true);
        
                            mScrollView = findViewById(R.id.scrollMap); //parent scrollview in xml, give your scrollview id value
                            ((WorkaroundMapFragment) getChildFragmentManager().findFragmentById(R.id.map))
                                    .setListener(new WorkaroundMapFragment.OnTouchListener() {
                                @Override
                                public void onTouch()
                                    {
                                            mScrollView.requestDisallowInterceptTouchEvent(true);
                                    }
                                });
                        }
            });
        }
    

    Update: Answer updated to getMapAsync() based on answer by @javacoder123

提交回复
热议问题