我已经在我的应用程序中添加了一个抽屉导航,它是一个管理 3 个 fragment 的 Activity 。 现在,当我单击抽屉导航列表中的某个项目时,我会获取所选项目的位置,并调用以下方法来显示所选 fragment :
private void displayView(int position) {
Fragment fragment = null;
switch (position) {
case 0:
fragment = new HomeFragment();
break;
case 1:
fragment = MapFragment.newInstance();
break;
case 2:
fragment = new NearbyFragment();
break;
default:
break;
}
if (fragment != null) {
replaceFragment(fragment);
mDrawerList.setItemChecked(position, true);
mDrawerList.setSelection(position);
setTitle(navMenuTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
}
}
这是 replaceFragment()
方法:
private void replaceFragment(Fragment fragment) {
String backStateName = fragment.getClass().getName();
String fragmentTag = backStateName;
boolean fragmentPopped = mFragmentManager.popBackStackImmediate (backStateName, 0);
if (!fragmentPopped && mFragmentManager.findFragmentByTag(fragmentTag) == null){
//fragment not in back stack, create it.
FragmentTransaction ft = mFragmentManager.beginTransaction();
ft.replace(R.id.content_frame, fragment, fragmentTag);
//ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
ft.addToBackStack(backStateName);
ft.commit();
}
}
问题: 当我单击主菜单(情况 0)时,导航会以流畅的动画关闭,没有任何问题。 但是当我选择 map 或附近的菜单(情况 1 和 2)时,动画会停止等待 fragment 加载。
我想使用AsyncTask
来替换后台线程中的 fragment ,但我不知道如何
如果有人可以向我解释我到底应该做什么,或者有更好的想法,那就太好了。
最佳答案
当您实现 ActionBarDrawerToggle
时,框架会提供抽屉关闭和打开时的回调:
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
/* replaceFragment() should be called here */
replaceFragment(fragment);
}
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
/* do nothing here */
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
所以你的 displayView()
方法应该如下所示:
private void displayView(int position) {
Fragment fragment = null;
switch (position) {
case 0:
fragment = new HomeFragment();
break;
case 1:
fragment = MapFragment.newInstance();
break;
case 2:
fragment = new NearbyFragment();
break;
default:
break;
}
if (fragment != null) {
//replaceFragment(fragment);
mDrawerList.setItemChecked(position, true);
mDrawerList.setSelection(position);
setTitle(navMenuTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
}
}
我在这里所做的是在抽屉关闭的回调中调用replaceFragment()
。
试试这个。这应该可行。
关于android - 替换 fragment 会阻止抽屉的动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28636621/