在导航抽屉关闭之前加载片段

Posted

技术标签:

【中文标题】在导航抽屉关闭之前加载片段【英文标题】:Load Fragment before Navigation Drawer closes 【发布时间】:2013-08-31 14:19:37 【问题描述】:

我已经实现了一个导航抽屉,我想在导航抽屉关闭之前加载我的片段。目前,fragment 与抽屉关闭并行加载,因此如果 fragment 很重,用户界面会挂起一段时间。

我的代码是:

private class DrawerItemClickListener implements
            ListView.OnItemClickListener 
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) 
                 FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
                 ft.replace(R.id.content_frame, fragmentProfile);
                 ft.commit();
                 drawerLayout.closeDrawer(drawerNaviListView);
        
    

如何更改此设置,以便我首先看到我的片段加载(在后台),当它完成加载时,导航抽屉关闭?

【问题讨论】:

【参考方案1】:

我的解决方案是在抽屉关闭后加载片段: 实际上在onDrawerClosed里面调用loadFragment方法

 public void onDrawerClosed() 

 // assure the request comes from selecting a menu item, not just closing tab
 if (selectedTab ) 
     selectItem(mSelectedFragment);
     selectedTab = false;
 

【讨论】:

【参考方案2】:

在抽屉关闭后尝试加载 使用处理程序创建延迟执行。这样抽屉关闭时就不会挂起

在方法onItemClick()中,使用下面的代码:

Handler handler = new Handler();

Runnable runnable = new Runnable() 

            @Override
            public void run() 
                FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
             ft.replace(R.id.content_frame, fragmentProfile);
             ft.commit();

            
        ;

        handler.postDelayed(runnable, 500); // here 500 is the delay 

// 其他方式是

创建一个 AsyncTask 并在 doInBackground() 方法中启动片段事务并在 onPostExecute() 中关闭抽屉

【讨论】:

上述解决方案是正确的,但是将ft.commit()替换为ft.commitAllowingStateLoss();因为你的片段状态在出现之前将是损失..【参考方案3】:

DrawerLayout.DrawerListener 可用于监控抽屉视图的状态和运动。 避免在动画期间执行昂贵的操作,例如布局,因为这可能会导致 口吃;尝试在 STATE_IDLE 状态期间执行昂贵的操作。 Source.

换句话说,android 建议您在交换 Fragments 之前等待抽屉关闭。

【讨论】:

以上是关于在导航抽屉关闭之前加载片段的主要内容,如果未能解决你的问题,请参考以下文章

使用导航抽屉旋转时的片段更改

如何打开关闭应用程序后打开的最后一个片段并使用导航抽屉和导航组件重新打开它

Android如何使用工具栏中的按钮切换以使用片段打开/关闭导航抽屉

滑出保持突出显示的导航项

导航抽屉,处理后退按钮以转到以前的片段?

NavHostFragment:使用导航抽屉重新打开更改的片段