Android MapView/SupportMapFragment在使用ViewPager2时出现图形故障

Android MapView/SupportMapFragment在使用ViewPager2时出现图形故障,android,google-maps,android-fragments,android-viewpager2,Android,Google Maps,Android Fragments,Android Viewpager2,我一直试图在ViewPager片段中使用MapView,但遇到了一个奇怪的bug。MapView不断出现故障,就像它试图重新渲染和奇怪地拉伸地图一样;但是,在使用缩放/手势时,这很好。当它停止移动时,它又开始发出毛刺。 在Nexus 7 SDK 22 emulator上,它工作正常,而在大多数其他模拟器/物理设备上,它似乎失败。这似乎是硬件问题,而不是SDK问题。 我还尝试在ViewPager中放置一个SupportMapFragment,它的行为与此完全相同。 在清单中禁用硬件加速可以减少问题

我一直试图在ViewPager片段中使用MapView,但遇到了一个奇怪的bug。MapView不断出现故障,就像它试图重新渲染和奇怪地拉伸地图一样;但是,在使用缩放/手势时,这很好。当它停止移动时,它又开始发出毛刺。 在Nexus 7 SDK 22 emulator上,它工作正常,而在大多数其他模拟器/物理设备上,它似乎失败。这似乎是硬件问题,而不是SDK问题。 我还尝试在ViewPager中放置一个SupportMapFragment,它的行为与此完全相同。 在清单中禁用硬件加速可以减少问题,但不能消除它。国家名称不断闪烁,整个屏幕每隔几秒钟就会出现一次黑色闪烁,而不是在没有硬件加速解决方案的情况下出现的弹性/故障

MapViewFragment

public class RealisedVisitsMapFragment extends Fragment implements OnMapReadyCallback {
    private FragmentRealisationVisitsMapBinding binding;

    public static RealisedVisitsMapFragment newInstance(LocalDate date) {
        RealisedVisitsMapFragment fragment = new RealisedVisitsMapFragment();
        return fragment;
    }



    private static final String MAPVIEW_BUNDLE_KEY = "MapViewBundleKey";

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        binding = FragmentRealisationVisitsMapBinding.inflate(inflater);
        return binding.getRoot();
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        Bundle mapViewBundle = null;
        if (savedInstanceState != null) {
            mapViewBundle = savedInstanceState.getBundle(MAPVIEW_BUNDLE_KEY);
        }
        binding.mapView.onCreate(mapViewBundle);
        binding.mapView.getMapAsync(this);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        Bundle mapViewBundle = outState.getBundle(MAPVIEW_BUNDLE_KEY);
        if (mapViewBundle == null) {
            mapViewBundle = new Bundle();
            outState.putBundle(MAPVIEW_BUNDLE_KEY, mapViewBundle);
        }

        binding.mapView.onSaveInstanceState(mapViewBundle);
    }

    @Override
    public void onResume() {
        super.onResume();
        binding.mapView.onResume();
    }

    @Override
    public void onStart() {
        super.onStart();
        binding.mapView.onStart();
    }

    @Override
    public void onStop() {
        super.onStop();
        binding.mapView.onStop();
    }

    @Override
    public void onMapReady(GoogleMap map) {
        map.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
    }

    @Override
    public void onPause() {
        binding.mapView.onPause();
        super.onPause();
    }

    @Override
    public void onDestroy() {
        binding.mapView.onDestroy();
        super.onDestroy();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        binding.mapView.onLowMemory();
    }

}
寻呼机

public class VisitsFragmentAdapter extends FragmentStateAdapter {
    public VisitsFragmentAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) {
        super(fragmentManager, lifecycle);
    }

    public VisitsFragmentAdapter(@NonNull Fragment fragment) {
        super(fragment);
    }


    @NonNull
    @Override
    public Fragment createFragment(int position) {
        switch (position) {
            case 0:
                return SupportMapFragment.newInstance();
            case 1:
                return new RealisedVisitsMapFragment();

            default:
                return null;
        }

    }

    @Override
    public int getItemCount() {
        return 2;
    }
}
用于设置viewpager的托管片段功能

   private void setupViewPager() {
        VisitsFragmentAdapter pagerAdapter = new VisitsFragmentAdapter(getChildFragmentManager(), getLifecycle());
        binding.vpVisitsRealization.setUserInputEnabled(false);
        binding.vpVisitsRealization.setAdapter(pagerAdapter);
        binding.vpVisitsRealization.requestTransparentRegion(binding.vpVisitsRealization);
        new TabLayoutMediator(binding.tabLayoutRealization, binding.vpVisitsRealization, (this::setTextByPosition)).attach();
    }

通过完全移除viewpager并手动膨胀片段来解决