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