【问题标题】:Navigation Drawer twitches on close导航抽屉关闭时抽搐
【发布时间】:2015-04-27 13:07:34
【问题描述】:

我尝试在我的应用中实现导航抽屉(材料设计)。我的活动包含带有片段的 FrameLayout。当用户在 Navigation Drawer 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();

        }
     }

当我单击项目时,一切正常。导航抽屉关闭不顺畅,但由于片段在后台重新加载而冻结(抽搐、抽搐)。

如何顺利关闭导航抽屉?

【问题讨论】:

    标签: java android android-fragments navigation-drawer


    【解决方案1】:

    你必须决定你是否喜欢更多:

    Fragment 替换为FrameLayout,然后关闭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
        }
     }
    

    实现第二种方法:

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

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

    并在您的DrawerLayout 上设置DrawerLayout.DrawerListener,如下所示:

    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) {
        }
    });
    

    【讨论】:

    • 谢谢先生!!正是我想要的:)
    【解决方案2】:

    抽屉关闭大约需要 200 毫秒。所以你可以这样做:

    Handler mHandler = new Handler();
    
    drawerLayout.closeDrawer( listViewDrawer);
    mHandler.postDelayed(
                    new Runnable() {
                        @Override
                        public void run () {
                            loadFragment();
                        }
                    }
                    , NAVDRAWER_CLOSE_DELAY // 250...for delay
            );
    

    【讨论】:

    • 当我使用此延迟时,导航抽屉快速关闭而不会冻结,但我的片段直到延迟才更新。仅在 200 毫秒延迟后才开始重新加载片段,这是“冻结”片段.... 有没有在导航抽屉和片段中冻结的解决方案? :(
    • 好吧,您可以制作动画...淡出当前片段,关闭抽屉,淡入新片段。关闭时我没有 jirks 但我正在使用这段代码,因为它同步得很好。谷歌也在他们的google IO 演示应用程序中使用此代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多