我创建了一个简单的应用程序来学习片段。它由一个带有三个菜单项的bottomNavigationView以及一个FrameLayout组成,该FrameLayout充当片段的容器,并占据了其余空间。选择一个项目可通过以下方式在FrameLayout中切换片段:
getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer,selectedFragment).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE).commit();
当我运行该应用程序时,我注意到片段之间的过渡非常缓慢。Profiler透露这是由于每次布局膨胀引起的。因此,我将片段的onCreateView()方法修改为仅膨胀一次,然后返回已经膨胀的布局。
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if(ui == null)
inflateLayout(inflater, container);
return ui;
}
这解决了部分问题,因为第一次转换仍然很慢。我想在活动中为片段UI充气,但这导致了一个错误:片段未附加到上下文。所以我只是在主要活动的onCreate()中的所有片段之间切换:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView nav = findViewById(R.id.bottom_nav);
homeFragment = new HomeFragment();
favFragment = new FavFragment();
starFragment = new StarFragment();
nav.setSelectedItemId(R.id.home);
getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer, starFragment).commit();
getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer, favFragment).commit();
getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer, homeFragment).commit();
nav.setOnNavigationItemSelectedListener(listener);
}
这使事情变得更好,但是StarFragment中包含的recyclerView仍然在“真实”事务(由侦听器启动)之后创建viewHolders,单个viewHolder花费20ms的时间(我将在后面讨论原因)。
我的问题是:如何快速处理片段之间的事务?我想做对的事情还是有更好的方法?
非常感谢!ViewPager使一切顺利。我的布局非常简单,就目前而言,我仍然不知道为什么夸大它们需要这么长时间。
很高兴知道我可以提供帮助!