MapView inside a ScrollView?
I have had a same problem for 10 days, but I got a solution a few minutes ago!!
Here is the solution.
I made a custom MapView and override onTouchEvent() like this.
@Override
public boolean onTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
// Disallow ScrollView to intercept touch events.
this.getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
// Allow ScrollView to intercept touch events.
this.getParent().requestDisallowInterceptTouchEvent(false);
break;
}
// Handle MapView's touch events.
super.onTouchEvent(ev);
return true;
}
how to set google map fragment inside scroll view
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
MapView inside NestedScrollView not scrolling smooth
I had the same problem. Here is the solution. I made a custom MapView and override onTouchEvent() like this.
@Override
public boolean onTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
// Disallow ScrollView to intercept touch events.
this.getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
// Allow ScrollView to intercept touch events.
this.getParent().requestDisallowInterceptTouchEvent(false);
break;
}
// Handle MapView's touch events.
super.onTouchEvent(ev);
return true;
}
When i put map inside Scrollview, it will move horizontally but can not move vertically
Other solutions from this site:
MapView inside a ScrollView?
ScrollView is catching touch event for google map
And for android map v2, follow this solution
ScrollView is catching touch event for google map
It seems you on the right way, but you should call requestDisallowInterceptTouchEvent(true) method on every touch event (see docs). Try this solution
Updated:
Try this out:
final HorizontalScrollView hsv = ...
final MapView mapView = ...
mapView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
hsv.requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
hsv.requestDisallowInterceptTouchEvent(false);
break;
}
return mapView.onTouchEvent(event);
}
});
Related Topics
Android: Automatically Choose Debug/Release Maps V2 API Key
How to Select Multiple Images from Gallery in Android
How Get Permission for Camera in Android.(Specifically Marshmallow)
Run Lint When Building Android Studio Projects
Javadoc in Eclipse Failing to Recognize Packages
Android Webview - Intercept Clicks
List View Items Changes Position When Scrolling Android
Image Size for All Screen Devices
How Can Write Code to Make Sharedpreferences for Array in Android
How to Show and Hide Actionbar with Appcompat V.7
Applying Colorfilter to Imageview with Shapeddrawable
Using Adb Logcat with a Real Phone (And Not the Emulator)
How to Mask an Edittext to Show the Dd/Mm/Yyyy Date Format
Bluetooth Pairing Without User Confirmation
How to Add External Fonts to Android Application
Whatsapp Message Layout - How to Get Time-View in the Same Row