替换片段会阻塞抽屉的动画
Replacing fragments blocks the animation of the drawer
我在我的应用程序中添加了一个导航抽屉,它是一个管理 3 个片段的 activity。
现在,当我从导航抽屉列表中单击一个项目时,我得到了 selected 项目的位置,我调用以下方法来显示 selected 片段:
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)时,导航以流畅的动画关闭,没有任何问题。
但是当我 select 地图或附近的菜单(情况 1 和 2)时,动画停止等待片段加载。
我想使用 AsyncTask
来替换后台线程中的片段,但我不知道如何
如果有人能向我解释我到底应该做什么,或者有更好的主意就好了。
当您实现 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()
。
试试这个。这应该有效。
我在我的应用程序中添加了一个导航抽屉,它是一个管理 3 个片段的 activity。 现在,当我从导航抽屉列表中单击一个项目时,我得到了 selected 项目的位置,我调用以下方法来显示 selected 片段:
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)时,导航以流畅的动画关闭,没有任何问题。 但是当我 select 地图或附近的菜单(情况 1 和 2)时,动画停止等待片段加载。
我想使用 AsyncTask
来替换后台线程中的片段,但我不知道如何
如果有人能向我解释我到底应该做什么,或者有更好的主意就好了。
当您实现 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()
。
试试这个。这应该有效。