bytedance / scene

Android Single Activity Framework compatible with Fragment.
Apache License 2.0
2.08k stars 198 forks source link

关于软键盘的思考 #25

Closed limalivy closed 4 years ago

limalivy commented 4 years ago

很高兴发现这个项目,我们的项目也是完全基于单Activity模式的,UI框架也是叫[Scene],由我独立开发维护,很多核心思想也和这个项目接近,目前暂时没有开源。在我们探索的过程中发现如果弹窗(基于Scene)需要软键盘输入就会导致底下的Scene变形,原因是Scene实际是基于View的,所有View都是在同一Window上操作的,而软键盘是直接操作Window。所以当软键盘弹出的时候也许UI框架需要做一个软键盘导致的View layout,measure 事件的特殊处理,相当于软键盘弹出事件分发机制。您觉得软键盘应该怎么处理呢?

qii commented 4 years ago

你可以看看这些代码

输入法的 demo https://github.com/bytedance/scene/blob/master/demo/src/main/java/com/bytedance/scenedemo/activity_compatibility/softkeyboard/SoftKeyboardDemoScene.java

Inset 的处理,NavigationScene 每个页面都会分发一次完整的 Inset https://github.com/bytedance/scene/blob/master/library/scene/src/main/java/com/bytedance/scene/utlity/DispatchWindowInsetsListener.java

你说的底下的 Scene 变形,说的是一个半透明的 Scene 盖在另外一个 Scene 上面吧,因为输入法的 flag 是 Window 级别的,一改,都收到了影响

limalivy commented 4 years ago

是的,半透明的 Scene A盖在另外一个 Scene B上面,用作弹窗目的。需要实现A展示以PAN模式显式,B展示以NOTHING模式

qii commented 4 years ago

Android 的 pan 是以修改 WindowInsets 实现,会跟普通的虚拟导航栏的 WindowInsets 混在一起。我感觉没啥太好的框架层提供 API 方法实现你要的效果,只能很琐碎在业务用的地方补些逻辑,让这个时候的 B,无视 WindowInsets 的变化。