BGASwipeBackLayout-Android icon indicating copy to clipboard operation
BGASwipeBackLayout-Android copied to clipboard

侧滑回来后,无法打开DrawerLayout

Open reakingf opened this issue 6 years ago • 8 comments

手机是小米5s,Android API 24 侧滑回来后,无法通过drawerLayout.openDrawer(Gravity.END)这句代码打开抽屉,通过手指侧滑拉出抽屉倒是没问题,但是通过那句代码就只能显示一层半透明的背景

reakingf avatar Jun 01 '18 12:06 reakingf

发现是由于侧滑回来后重新onAttachedToWindow导致drawerLayout.mFirstLayout=true,所以目前我个人的解决方法是在执行drawerLayout.openDrawer前执行drawerLayout.requestLayout(),重新将drawerLayout.mFirstLayout置为false,希望有更好的解决方法!

reakingf avatar Jun 04 '18 02:06 reakingf

执行drawerLayout.openDrawer前执行drawerLayout.requestLayout(),重新将drawerLayout.mFirstLayout置为false

@reakingf 执行requestlayout() 没有使drawerLayout.mFirstLayout置为false ,需要什么地方特殊处理吗

yanchengdeng avatar Dec 03 '18 01:12 yanchengdeng

执行drawerLayout.openDrawer前执行drawerLayout.requestLayout(),重新将drawerLayout.mFirstLayout置为false

@reakingf 执行requestlayout() 没有使drawerLayout.mFirstLayout置为false ,需要什么地方特殊处理吗

不用啊,其实将mFirstLayout置为false是在onLayout中执行的,requestLayout只是为了触发onLayout

reakingf avatar Dec 03 '18 14:12 reakingf

@reakingf

侧滑后 ,drawerLayout 没有执行onLayout() 方法, 而且侧滑返回执行

protected void onDetachedFromWindow() { super.onDetachedFromWindow(); this.mFirstLayout = true; }

protected void onAttachedToWindow() {
    super.onAttachedToWindow();
    this.mFirstLayout = true;
} 

导致 mFirstLayout 这个参数一直为true ,进而导致openDrawer 里打开失败

yanchengdeng avatar Dec 04 '18 08:12 yanchengdeng

@reakingf

侧滑后 ,drawerLayout 没有执行onLayout() 方法, 而且侧滑返回执行

protected void onDetachedFromWindow() { super.onDetachedFromWindow(); this.mFirstLayout = true; }

protected void onAttachedToWindow() {
    super.onAttachedToWindow();
    this.mFirstLayout = true;
} 

导致 mFirstLayout 这个参数一直为true ,进而导致openDrawer 里打开失败

对的啊,就是因为侧滑回来后会重新执行onAttachedToWindow,导致mFirstLayout = true,因此我们在下一次执行openDrawer之前需要让drawerLayout重新执行onLayout。并不是说侧滑后会自动执行onLayout,这是需要我们手动执行的,如调用requestLayout。

reakingf avatar Dec 04 '18 09:12 reakingf

是这样的,正常调用requestLayout方法都会重新执行onLayout()方法,但是侧滑回来后,不知道是否是 /** * Called from layout when this view should * assign a size and position to each of its children. * * Derived classes with children should override * this method and call layout on each of * their children. * @param changed This is a new size or position for this view * @param left Left position, relative to parent * @param top Top position, relative to parent * @param right Right position, relative to parent * @param bottom Bottom position, relative to parent */ protected void onLayout(boolean changed, int left, int top, int right, int bottom) { } DrawerLayout控件已经不会在改变大小,导致onlayou 不会再重新执行,我这边是有使用requestLayout ,在debug 过程中侧滑返回是没有看到执行的

@reakingf

yanchengdeng avatar Dec 05 '18 02:12 yanchengdeng

@yanchengdeng 不知是你没理解我的意思还是我没理解你的意思。首先侧滑返回DrawerLayout是不会自动执行onlayout的,我的意思是要你在侧滑返回之后,再次重新openDrawer之前,也就是这两个事件之间,手动去调用requestLayout。

reakingf avatar Dec 05 '18 03:12 reakingf

我也遇到这个问题了,希望作者能提供一个更好的方法解决

Alan-li avatar Oct 10 '19 08:10 Alan-li