像这样在xml中膨胀我的Mapview
<android.support.v4.widget.NestedScrollView android:id="@+id/sv_offers" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="56dp" android:visibility="gone" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.xys.widgets.CustomMapView android:id="@+id/mapView" android:layout_width="match_parent" android:layout_height="125dp"/> </LinearLayout> </android.support.v4.widget.NestedScrollView>
我已经实现了自定义Mapview如下: –
public class CustomMapView extends MapView { private ViewParent mViewParent; public CustomMapView(Context context) { super(context); } public CustomMapView(Context context,AttributeSet attrs) { super(context,attrs); } public CustomMapView(Context context,AttributeSet attrs,int defStyle) { super(context,attrs,defStyle); } public void setViewParent(@Nullable final ViewParent viewParent) { //any ViewGroup mViewParent = viewParent; } public CustomMapView(Context context,GoogleMapOptions options) { super(context,options); } @Override public boolean onInterceptTouchEvent(final MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (null == mViewParent) { getParent().requestDisallowInterceptTouchEvent(true); Timber.d("Inside if of action down"); } else { mViewParent.requestDisallowInterceptTouchEvent(true); Timber.d("Inside else of action down"); } break; case MotionEvent.ACTION_UP: if (null == mViewParent) { getParent().requestDisallowInterceptTouchEvent(false); Timber.d("Inside if of action up"); } else { mViewParent.requestDisallowInterceptTouchEvent(false); Timber.d("Inside else of action up"); } break; default: break; } return super.onInterceptTouchEvent(event); } }
并在我的Activity的onCreate()中使用了mapview
mapView = (CustomMapView) findViewById(R.id.mapView); mapView.onCreate(savedInstanceState); GoogleMap googleMap = mapView.getMap(); googleMap.setMyLocationEnabled(false); googleMap.getUiSettings().setMyLocationButtonEnabled(false); googleMap.getUiSettings().setCompassEnabled(false); googleMap.getUiSettings().setAllGesturesEnabled(false); mapView.setViewParent(nestedScrollContainer);
其中nestedScrollContainer是我的嵌套scrollView.Tried在SO中提供了许多变通办法,但似乎无法获得滚动问题的解决方法.帮助将不胜感激!谢谢
解决方法
在你的代码MapView里面的NestedScrollView – >的LinearLayout – > com.xys.widgets.CustomMapView两级层次结构.
因此,在您的情况下,您可以访问NestedScrollView,如下所示
getParent().getParent().requestDisallowInterceptTouchEvent(true);
改变这一行
.的getParent()requestDisallowInterceptTouchEvent(真);对此
getParent().getParent().requestDisallowInterceptTouchEvent(true);
以下是您的案例的完整代码
<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.xys.widgets.CustomMapView android:id="@+id/mapView" android:layout_width="match_parent" android:layout_height="125dp"/> </LinearLayout> </android.support.v4.widget.NestedScrollView>
`
public class CustomMapView extends MapView { private ViewParent mViewParent; public CustomMapView(Context context) { super(context); } public CustomMapView(Context context,AttributeSet attrs) { super(context,attrs); } public CustomMapView(Context context,int defStyle) { super(context,defStyle); } public void setViewParent(@Nullable final ViewParent viewParent) { //any ViewGroup mViewParent = viewParent; } public CustomMapView(Context context,GoogleMapOptions options) { super(context,options); } @Override public boolean onInterceptTouchEvent(final MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: getParent().getParent().requestDisallowInterceptTouchEvent(true); Timber.d("Inside if of action down"); break; case MotionEvent.ACTION_UP: getParent().getParent().requestDisallowInterceptTouchEvent(false); Timber.d("Inside if of action up"); break; default: break; } return super.onInterceptTouchEvent(event); } }