android - 替换 fragment 会阻止抽屉的动画

标签 android android-fragments android-animation navigation-drawer

我已经在我的应用程序中添加了一个抽屉导航,它是一个管理 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/

相关文章:

android - 如何在Android中制作具有物理效果的布局?

android - 以编程方式列出所有默认应用程序

没有HTTP或HTTPS通信的android ssl通信

java - 是否有必要在分离时将 Fragment 接口(interface)监听器设置为 null?

java - OnActivityResult不是调用内部fragment而是调用android中的Main Activity

android - Android 中启动前序列动画卡住

Android:单击搜索时,ActionBar 图标和导航下拉菜单之间的边距会发生变化

android - 继承ActionBarSherlock和Android YouTubePlayer

android-fragments - 如何使用导航组件配置DrawerLayout

android - PopupWindow 进入退出动画不适用于棉花糖 (23)