簡體   English   中英

Android底部導航碎片問題

[英]Android bottom navigation fragments issue

我在我的活動中使用帶有片段的底部導航。 每個導航項都有四個片段。 一切正常,除了片刻。 onCreate我使用此代碼在創建活動時加載第一個片段:

   //Manually displaying the first fragment - one time only

        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            transaction.replace(R.id.frame_layout, MyCoursesFragment.newInstance("",""));
            transaction.commit();

我的 BottomNavigationListener 是:

 private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
        = new BottomNavigationView.OnNavigationItemSelectedListener() {

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        Fragment selectedFragment = null;
        switch (item.getItemId()) {
            case R.id.navigation_home:
                selectedFragment = MyCoursesFragment.newInstance("","");
                break;
            case R.id.navigation_dashboard:
                selectedFragment = CatalogFragment.newInstance("","");
                break;
            case R.id.navigation_notifications:
                selectedFragment = MessagesFragment.newInstance("","");
                break;
            case R.id.my_people:
                selectedFragment = MyPeopleFragment.newInstance("","");
                break;
        }
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.frame_layout, selectedFragment);
        transaction.commit();
        return true;
    }

};

所以,當我旋轉手機和屏幕方向改變時,我總是得到第一個 Fragment(因為來自 onCreate 的第一段代碼)。

沒有它,我會在旋轉后得到正確的片段,但在第一次打開時屏幕將是空的。

如何在旋轉后獲得正確的片段並在活動開始時加載第一個片段?

Activity is recreated after each rotation by default.

您可以使用AndroidManifest中活動標簽的configChanges屬性覆蓋此行為。

android:configChanges="orientation|screenSize"

處理配置更改

上述解決方案對我不起作用。
對我有用的是在加載默認片段之前檢查saveInstanceState是否為null。 這樣可以確保即使在旋轉時,如果saveInstanceState中存在屬於另一個片段的數據,默認情況下也不會默認顯示默認片段

if(savedInstanceState==null) {
   //This is the function you call onCreate to load default fragment
   loadFragments(new MyDefaultFragment());
}

只需檢查 bundle(OnsavedInstanceSate) 是否為空,然后顯示默認片段

暫無
暫無

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

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