简体   繁体   中英

Navigation drawer lags in Android when opening or closing fragment in Android

I have made one project having navigation drawer in it and when I open any fragment from the expandable listview, the drawer hangs for 2 to 3 seconds and than show the new fragment.

Does anyone having any idea about this?

HomeActivity.java

private void setFragment(int grpPos, int childPos, String fragmentName, boolean isDrawerToBeClosed) {
        try {
            imgHome.setVisibility(View.GONE);
            switch (grpPos) {
                case 0:
                    callHomeFragment();
                    break;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

private void callHomeFragment() {
        try {
            FragmentManager fragmentManager = getSupportFragmentManager();
            Fragment fragmentExisting = fragmentManager.findFragmentByTag(
                    getResources().getString(R.string.menu_home));
            if (fragmentExisting != null) {
                Fragment Home = fragmentManager.findFragmentByTag(getResources().getString(R.string.menu_home));
                if (fragmentExisting.equals(Home)) {
                    Fragment fragment2 = new HomeFragment();
                    fragmentManager.beginTransaction().replace(R.id.fragment_content_frame, fragment2,
                            getResources().getString(R.string.menu_home)).commit();
                }
                showFragment(fragmentExisting, fragmentManager);
                drawer.closeDrawer(GravityCompat.START);
            } else {
                Fragment fragment = new HomeFragment();
                fragmentManager.beginTransaction().replace(R.id.fragment_content_frame, fragment,
                        getResources().getString(R.string.menu_home)).commit();
                drawer.closeDrawer(GravityCompat.START);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

private void showFragment(Fragment fragmentExisting, FragmentManager fragmentManager) {
        FragmentManager fragmentManagerInternal = getSupportFragmentManager();
        for (int i = 0; i < fragmentManagerInternal.getBackStackEntryCount(); ++i) {
            fragmentManagerInternal.popBackStack();
        }
        fragmentManagerInternal.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

        try {
            List<Fragment> fragments = fragmentManager.getFragments();
            if (fragments != null && fragments.size() > 0) {
                for (int i = 0; i < fragments.size(); i++) {
                    if (fragments.get(i) != null) {
                        fragmentManager.beginTransaction().hide(fragments.get(i)).commit();
                    }
                }
            }
            fragmentManager.beginTransaction().show(fragmentExisting).commit();
        } catch (Exception exception) {
//            ((MyApplication) getApplicationContext()).printStackTrace(exception);
        }
    }

I have added postdelayed method to my fragment call and it works fine.

private void setFragment(int grpPos, int childPos, String fragmentName, boolean isDrawerToBeClosed) {
        try {
            imgHome.setVisibility(View.GONE);
            switch (grpPos) {
                case 0:
                    runnableCode = new Runnable() {
                        @Override
                        public void run() {
                            callHomeFragment();
                        }
                    };
                    handler.postDelayed(runnableCode, 200);
                    break;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM