【问题标题】:Slow work of transitions between fragments in the ViewPagerViewPager 中片段之间的过渡工作缓慢
【发布时间】:2018-01-26 21:52:16
【问题描述】:

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-Fragment NotificationFragment 时,同时会创建一个 5-Fragment ProfileFragment,也就是说,它们可以工作:

D/== Profile Fragment ==: onAttach()
D/== Profile Fragment ==: onCreateView()
D/== Profile Fragment ==: onViewCreated()
D/== Profile Fragment ==: onResume()

问题:

  • 是否可以确保当您单击菜单项时,仅触发与我单击的此 fragment 相关的那些方法,而接下来会初始化未找到 fragments 的方法?

  • 差不多,但是ProfileFragment中的google map初始化并没有延迟主线程?

UPD:

我刚刚意识到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。那么现在该怎么办,怎么解决呢?

【问题讨论】:

    标签: java android google-maps android-fragments android-viewpager


    【解决方案1】:

    你可以使用viewPagerAdapter.setOffscreenPageLimit(2);,这会缓存未使用的片段

    【讨论】:

      【解决方案2】:

      使用查看寻呼机时的默认屏幕外限制为1。这意味着将始终缓存下一个相邻的片段。你的滞后是因为ProfileFragment 在你打开它旁边的片段时也是初始化的。

      您可以覆盖setUserVisibleHint 以仅当该片段对用户可见时才在该片段中初始化事物。

      @Override
      public void setUserVisibleHint(boolean isVisibleToUser) {
          super.setUserVisibleHint(isVisibleToUser);
          if (isVisibleToUser) {
              // load map
          }
      }
      

      【讨论】:

      • 谢谢,但事实证明这不是问题
      • 出了什么问题?
      • 我还没有决定。更新问题
      猜你喜欢
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多