之前寫過一篇文章 Android-->如何優(yōu)雅的切換表情和鍵盤(原理), 沒有看多的可以看看.
這個方案有一個問題, 當狀態(tài)欄透明的時候, 就會出現(xiàn)問題. 而且也不支持在Dialog中使用.
實現(xiàn)方式也很簡單, 但是代碼邏輯很復(fù)雜, 不容易修改. 一不小心就會出錯, 還找不到原因.
今天這篇文章, 讓你煥然一新. 完全顛覆之前的方案.
前提,2個屬性
android:windowSoftInputMode="adjustResize"
android:fitsSystemWindows="true"
會出現(xiàn)的坑:
如果通過簡單的onSizeChange回調(diào), 處理鍵盤彈出. 那么當狀態(tài)欄透明之后, 這個方法是不會回調(diào)的.
因為, 當狀態(tài)欄透明之后, 這個時候你的API已經(jīng)滿足了>=20. 這個時候:onApplyWindowInsets 此方法正好就是API 20的時候加入進來的.
從20開始, 系統(tǒng)改變了鍵盤彈出時, 布局的響應(yīng)屬性, 從原來的Height變化, 變成了最新的Padding變化.
也就是: 原來鍵盤彈出的時候, Layout的高度會變?yōu)樵瓉淼母叨?鍵盤的高度;
而現(xiàn)在: Layout的高度不變, 但是PaddingBottom會變?yōu)殒I盤的高度.
這樣就會導(dǎo)致onSizeChanged不會回調(diào), 因為高寬都一樣.
如果此時, 你要對不同的系統(tǒng)版本最適配, 提供對應(yīng)的解決方案的話....那么,你將走向一條不歸路.
其實,聰明的你, 應(yīng)該也能想出解決方法.
以下是我的方案:
1:onMeasure
在測量內(nèi)容高度和表情高度的時候, 根據(jù)鍵盤是否彈出, paddingBottom是否為空, 布局的height是否有變化.
決定內(nèi)容的高度, 和 表情的高度. 主要是一定要確定內(nèi)容的高度(要考慮鍵盤).
2:onLayout
有了高度, 就可以擺放內(nèi)容布局和表情布局.
其實只要內(nèi)容布局擺放合理, 表情布局在鍵盤彈出的時候可以任意擺放. 只要不影響內(nèi)容就行.
就這么簡單,