簡體   English   中英

如何在 AppCompatActivity.onCreate() 中增加片段的布局?

[英]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以便在第一次加載完成后始終加載片段。

這是一個關於如何添加帶有底部導航欄的ViewPager 的好教程 我希望這有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM