打开另一个活动后关闭导航抽屉

cre*_*ver 3 android navigation-drawer

所以我已经实现了导航抽屉,它工作正常.我有一个动作栏项目,用于下一个活动.通过单击该操作栏图标进入第二个活动时,如果导航抽屉打开,则即使用户返回到第一个活动,它仍然保持打开状态.我试过用

drawerLayout.closeDrawer(drawerListView);
Run Code Online (Sandbox Code Playgroud)

在调用intent之后但发生的事情是在关闭第一个活动的动画完成后开始的第二个活动.这会造成糟糕的用户体验,甚至我也不喜欢它.

所以在创建第二个活动后我可以用任何方式关闭抽屉吗?我的意思是从第二个活动的onCreate或某个地方?

Tom*_*Tom 6

您可以使用DrawerLayout.closeDrawer(int/View, bool)支持库的v24中的新方法立即关闭抽屉:

drawerLayout.closeDrawer(Gravity.LEFT, false);
Run Code Online (Sandbox Code Playgroud)

在你的地方onResume,如果你想在抽屉动画项目上点击关闭,但关闭,当你从另外一个回到活动.


Bob*_*ton 5

经过长时间浏览DrawerLayout.java的源代码后,我找到了一种方法.当用户返回第一个活动以关闭抽屉而不运行动画时运行此命令:

View view = drawerLayout.getChildAt(drawerLayout.getChildCount() - 1);
 ViewTreeObserver vto = view.getViewTreeObserver();

 vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                @Override
                public boolean onPreDraw() {
                    final DrawerLayout.LayoutParams lp = new DrawerLayout.LayoutParams(view.getWidth(), view.getHeight());
                    lp.gravity = Gravity.LEFT;
                    view.setLayoutParams(lp);
                    view.setLeft(-view.getMeasuredWidth());
                    view.getViewTreeObserver().removeOnPreDrawListener(this);
                    return true;
                }
            });
Run Code Online (Sandbox Code Playgroud)

说明

首先找到与导航视图对应的视图,这将是drawerLayout的最后一个子节点.将左侧位置设为减去其宽度(对于左侧抽屉).

正如Lorne Laliberte所提到的,你还需要将LayoutParams.knownOpen更改为false才能使其工作,但是无法访问创建appcompat-v4的本地副本并对其进行编辑的缺点 - 因为这是一个私有字段.这就是我的技巧所在.在java中,默认布尔值设置为false.使用旧的宽度和高度创建新的LayoutParams将导致将knownOpen设置为false.然后我们可以将其设置为覆盖旧LayoutParams的视图.如果视图尚未布局,例如在旋转屏幕之后,则需要将其放入预绘制侦听器内.

请问我是否有人在上班时遇到问题.