Android中ScrollView嵌套Map的触摸冲突及getMap()弃用问题求助
getMap() for ScrollView-GoogleMap Scroll Conflict Hey there! I see you're tackling two issues at once: fixing the scroll conflict between a GoogleMap inside a ScrollView, and dealing with the deprecated getMap() method. Let's get this sorted out properly.
The Root Problem
The getMap() method was deprecated a while back, and Google recommends using getMapAsync() instead. This asynchronous method ensures you only get the GoogleMap instance once it's fully initialized, avoiding null pointer exceptions and unreliable behavior.
Step-by-Step Fix
1. Update Your Fragment's onViewCreated Method
Replace your direct getMap() call with getMapAsync(), leveraging the OnMapReadyCallback your fragment already implements:
@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // Get reference to your custom WorkaroundMapFragment WorkaroundMapFragment mapFragment = (WorkaroundMapFragment) getChildFragmentManager().findFragmentById(R.id.map); // Use getMapAsync instead of getMap() mapFragment.getMapAsync(this); // Keep your existing touch listener for scroll conflict fix mapFragment.setListener(new WorkaroundMapFragment.OnTouchListener() { @Override public void onTouch() { mScrollView.requestDisallowInterceptTouchEvent(true); } }); }
2. Implement the onMapReady Callback
Since your OrderDetailsActivityFragment already implements OnMapReadyCallback, add this method to receive the initialized GoogleMap instance:
@Override public void onMapReady(GoogleMap map) { this.googleMap = map; // Now you can safely configure your map here // Example configurations: // googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); // googleMap.getUiSettings().setZoomControlsEnabled(true); // Add markers, move camera, etc. }
3. Clean Up Your XML Layout
Your current fragment XML has both android:name pointing to the default SupportMapFragment and class pointing to your custom fragment. Remove the conflicting entry to avoid confusion—keep only the reference to your WorkaroundMapFragment:
<fragment xmlns:tools="http://schemas.android.com/tools" android:id="@+id/map" android:name="com.example.jonida.restsapp.customFragment.WorkaroundMapFragment" android:layout_width="0dp" android:layout_height="0dp" android:layout_marginEnd="8dp" android:layout_marginStart="8dp" android:layout_marginTop="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/guideline3" tools:context="com.example.mapwithmarker.MapsMarkerActivity"/>
Why This Works
getMapAsync()ensures you get a validGoogleMapinstance only after it's fully loaded, eliminating the risk of null values that came with the synchronousgetMap().- Your custom
WorkaroundMapFragmentstill handles the scroll conflict by intercepting touch events and telling the ScrollView to stop intercepting when the map is touched.
内容的提问来源于stack exchange,提问作者Fatjon Rrapaj

