A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1黑马币
如何解决Android键盘面板冲突?下面深圳问答网的师生来探讨一下这个问题.


学生提问:如何解决Android键盘面板冲突?

老师回到:

基本原理答疑为什么onMeasure、onLayout、onGlobalLayout 分别在这三个里面做不同的处理?1. 为什么需要在CustomRootLayout的onMeasure中判断,而不是其他地方判断是否是真正键盘引起变化的?
必须要在PanelLayout的onMeasure之前获知键盘变化,因此比较恰当的地方就是PanelLayout的父布局的onMeasure,ps: 其实真正感知键盘变化我们可以非常确定(肯定会受到键盘变化影响的)的也只有对我们可见的最外层的布局。综合之,并且就就封装而言就只能是CustomRootLayout的onMeasure。
2. 为什么需要在PanelLayout的onMeasure中做防止面板闪现而不是其他地方?
如果在onLayout或者其他点中处理,都没有onMeasure中处理简单精准,PanelLayout的onMeasure结果的影响不仅仅是PanelLayout自己将要进行的大小与layout,还有其他View的布局layout与大小。
3. 为什么要在CustomRootLayout的onLayout来判断是否键盘弹起,而不是其他地方?
CustomRootLayout的onLayout中判断,是准确 与 获知变化时间比较早 的权衡结果。
4. 为什么要在onGlobalLayout中处理真正的键盘变化并且进行键盘高度变化存储?
由于LinearLayout(目前CustomRootLayout继承自LinearLayout)在存在weight参数的时候,需要measure多次来确定子view适当的大小,因此onMeasure可能被多次调用,而onGlobalLayout是布局变化后只会被一次调用,并且我们需要处理所有键盘高度的变化(如搜狗输入法的动态调整键盘高度)因此在onGlobalLayout中计算键盘高度变化以及有效高度进行存储更为恰当。
能不能只在一个View里面做所有的处理?
我们需要较早的布局变化中获知是否是键盘变化,至少要在面板大小变化进而导致布局变化之前获知,并且需要十分确定该布局受到键盘影响肯定会随之变化(对我们而言只能是可见的顶层布局) ,并且需要处理掉面板闪动的那一帧,结合前面问题的解答。这里无法避免就引入了两个布局, 对于我们可见的顶级布局(CustomRootLayout)与面板布局(PanelLayout)。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马