Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

侧滑回来后,无法打开DrawerLayout #112

Open
reakingf opened this issue Jun 1, 2018 · 8 comments
Open

侧滑回来后,无法打开DrawerLayout #112

reakingf opened this issue Jun 1, 2018 · 8 comments

Comments

@reakingf
Copy link

reakingf commented Jun 1, 2018

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

@reakingf
Copy link
Author

reakingf commented Jun 4, 2018

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

@yanchengdeng
Copy link

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

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

@reakingf
Copy link
Author

reakingf commented Dec 3, 2018

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

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

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

@yanchengdeng
Copy link

@reakingf

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

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

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

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

@reakingf
Copy link
Author

reakingf commented Dec 4, 2018

@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。

@yanchengdeng
Copy link

yanchengdeng commented Dec 5, 2018

是这样的,正常调用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

@reakingf
Copy link
Author

reakingf commented Dec 5, 2018

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

@Alan-li
Copy link

Alan-li commented Oct 10, 2019

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants