2013-08-28 79 views
8

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

我的代码是:

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); 
     } 
    } 

我怎样才能改变这种做法,我看到我的片段加载(背景)第一,当它已经完成加载,导航抽屉关闭?

回答

3

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

public void onDrawerClosed() { 

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

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

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

3

尝试加载抽屉关闭 使用处理程序来创建一个延迟执行后。这样就不会有当抽屉关闭

里面的方法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()

+1

上述解决方案是正确的,但用ft.commitAllowingStateLoss()替换ft.commit();因为你的片段状态会在带来前面的损失。 – Sivakumar