我在ViewPager
中有 5 个片段。在MainActivity
中初始化ViewPager
:
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
CalendarFragment scheduleFragment = new CalendarFragment(); // this should be in getItem()
ServicesFragment servicesFragment = new ServicesFragment(); // this should be in getItem()
ReviewsFragment reviewsFragment = new ReviewsFragment(); // this should be in getItem()
NotificationFragment notificationFragment = new NotificationFragment(); // this should be in getItem()
ProfileFragment profileFragment = new ProfileFragment(); // this should be in getItem()
viewPagerAdapter.addFragment(scheduleFragment); // this line can cause crashes
viewPagerAdapter.addFragment(servicesFragment); // this line can cause crashes
viewPagerAdapter.addFragment(reviewsFragment); // this line can cause crashes
viewPagerAdapter.addFragment(notificationFragment); // this line can cause crashes
viewPagerAdapter.addFragment(profileFragment); // this line can cause crashes
viewPager.setAdapter(viewPagerAdapter);
}
在ProfileFragment
我与google Maps
一起工作.我初始化为onCreateView()
:
if (mMap == null) {
final OnMapReadyCallback mapListener = this;
new Handler().postDelayed(() -> {
if (isAdded()) {
mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(mapListener);
}
}, 1000);
}
尝试在onViewCreated()
和onResume()
上初始化,结果是一样的。
所以问题是当我按 5 个菜单项中的 4 个时,它会挂起半秒钟。因为当您单击时 4 片段NotificationFragment
,同时创建一个 5 片段ProfileFragment
,也就是说,它们工作:
D/== Profile Fragment ==: onAttach() D/== Profile Fragment ==: onCreateView() D/== Profile Fragment ==: onViewCreated() D/== Profile Fragment ==: onResume()
问题:
是否可以确保当您单击菜单项时,仅触发与我单击的此
fragment
相关的那些方法,并且接下来找不到与之一起初始化的fragments
?左右,但是
ProfileFragment
中的谷歌地图初始化并没有延迟主线程?
上级:
我刚刚意识到Fragment
的打开很慢是因为layout
,那是因为Google Maps
碎片而不是因为OnMapReadyCallback
<fragment
android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
当我从layout.xml
中删除google maps
时,它的工作速度很快。但我需要google maps
.那么现在怎么办,怎么解决呢?
您可以使用viewPagerAdapter.setOffscreenPageLimit(2);
,这将缓存未使用的片段
使用视图寻呼机时的默认屏幕外限制为1
。这意味着紧邻片段将始终被缓存。滞后是因为当您打开旁边的片段时,ProfileFragment
也是初始化的。
仅当片段对用户可见时,您才能覆盖setUserVisibleHint
以初始化此片段中的内容。
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// load map
}
}