替换片段会阻塞抽屉的动画

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()

试试这个。这应该有效。