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

Android 在导航抽屉关闭之前加载片段,android,android-fragments,navigation,Android,Android Fragments,Navigation,我已经实现了一个导航抽屉,我想在导航抽屉关闭之前加载我的片段。目前,碎片与抽屉关闭并行加载,因此如果碎片很重,用户界面会挂起一点 我的密码是: private class DrawerItemClickListener implements ListView.OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View vi

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

我的密码是:

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);
        }
    }
私有类DrawerItemClickListener实现
ListView.com侦听器{
@凌驾
public void onItemClick(AdapterView父视图、视图、整型位置、,
长id){
FragmentTransaction ft=getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content\u frame,fragmentProfile);
ft.commit();
抽屉布局。关闭抽屉(抽屉视图);
}
}

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

DrawerLayout.DrawerListener可用于监视抽屉视图的状态和运动。 避免在动画过程中执行昂贵的操作,如布局,因为这可能会导致 口吃;在空闲状态下尝试执行昂贵的操作


换句话说,Android建议您在交换片段之前等待抽屉关闭。

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

 public void onDrawerClosed() {

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

试着在抽屉关闭后装入 使用处理程序创建延迟执行。这样抽屉关上时就不会有任何悬空了

在方法
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();因为你的碎片状态在被带到前线之前会丢失。。