导航抽屉在关闭时抽搐

Tap*_*ave 4 java android android-fragments navigation-drawer

我在我的应用程序中尝试实现导航抽屉(Material Design).我的活动包含带有片段的FrameLayout.当用户在导航抽屉中选择项目时FrameLayout重新加载新片段:

    listViewDrawer.setOnItemClickListener( new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick( AdapterView<?> parent, View view, int position, long id) {

            drawerLayout.closeDrawer( listViewDrawer); // <<<-------

            toolbar.setTitle( getResources().getString( R.string.title));

            fragmentMain = new FragmentMain();

            android.app.FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction()
                       .replace( R.id.frameLayoutMain, ApplicationTapaKiosk.getInstance().fragmentMain)
                       .commit();

        }
     }
Run Code Online (Sandbox Code Playgroud)

当我点击项目都工作正常.导航抽屉关闭不顺畅,但冻结(抽搐,抽搐)因为片段在后台重新加载.

导航抽屉有多接近顺畅?

Bar*_*ski 9

您必须决定是否更喜欢:

替换FragmentFrameLayout然后关闭DrawerLayout

要么

关闭DrawerLayout然后更换你的Fragment.

实施第一种方法:

只需在代码中进行以下更改:

listViewDrawer.setOnItemClickListener(new AdapterView.OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        toolbar.setTitle(getResources().getString(R.string.title));

        fragmentMain = new FragmentMain();

        android.app.FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction()
                   .replace(R.id.frameLayoutMain, ApplicationTapaKiosk.getInstance().fragmentMain)
                   .commit();

        fragmentManager.executePendingTransactions(); // wait for the transaction to finish
        drawerLayout.closeDrawer(listViewDrawer); // call closeDrawer(...) as a last thing
    }
 }
Run Code Online (Sandbox Code Playgroud)

实施第二种方法:

在用户点击时设置某种标志:

listViewDrawer.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        mDrawerItemClicked = true;
        drawerLayout.closeDrawer(listViewDrawer); 
    }
 }
Run Code Online (Sandbox Code Playgroud)

并设置DrawerLayout.DrawerListener在你的上面DrawerLayout,像这样:

drawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() {
    @Override
    public void onDrawerSlide(View drawerView, float slideOffset) {
    }

    @Override
    public void onDrawerOpened(View drawerView) {
    }

    @Override
    public void onDrawerClosed(View drawerView) {
        if (mDrawerItemClicked){
            mDrawerItemClicked = false;

            toolbar.setTitle(getResources().getString(R.string.title));
            fragmentMain = new FragmentMain();
            android.app.FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction()
                   .replace(R.id.frameLayoutMain, ApplicationTapaKiosk.getInstance().fragmentMain)
                   .commit();
        }
    }

    @Override
    public void onDrawerStateChanged(int newState) {
    }
});
Run Code Online (Sandbox Code Playgroud)