[英]How to inflate fragment's layout in AppCompatActivity.onCreate()?
我正在创建一个简单的应用程序来学习片段。 它由一个包含三个菜单项的 bottomNavigationView 和一个用作片段容器并占据其余空间的 FrameLayout 组成。 选择一个项目将 FrameLayout 中的 Fragment 切换为:
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 需要 20 毫秒(稍后我将研究原因)。
我的问题是:如何在片段之间快速进行这些交易? 我正在尝试做的事情是正确的,还是有更好的方法?
我不确定您的布局有多复杂,但是,如果数据加载器(从数据库中读取RecyclerView
值、网络调用)是离线的,则在片段布局中加载 UI 元素应该不会花费太多时间。
您确实不必在活动的onCreate
函数中执行所有片段事务。 当您单击底部导航栏中的项目时,只需按需加载片段(或执行片段事务)。 您正在onCreate
函数中创建片段的实例,这非常好,这样,每次在片段之间切换时,都不会创建片段类的新实例。
我不确定是否可以对片段的初始加载进行更优化,但是,您可以考虑使用ViewPager
以便在第一次加载完成后始终加载片段。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.