[英]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.