2017年10月22日 星期日

[Android] 監聽軟鍵盤方式

年前做的功能遇到問題,年尾來清倉。
因為製作的view比較複雜,是個LinearLayout包著EditText和Textview,
需要做鍵盤出現某個複合的view被頂上來的功能。
必須監聽軟件盤出現的時間點。
  • adjustPan 這個很好用,但因為我的Textview擺在EditText下面,會發現被頂上來的只有EditText
  • android:windowSoftInputMode="adjustresize"
    這個只適合你的view在最下面的情況才會頂上來,萬一view在中下方(非底部)也是不會頂上來。
  • 既然要做到複合view鍵盤打開,
    要判斷他是否被蓋到,如果蓋到,則頂上來,沒蓋到,則不動。
    只能自己算view移動的位置。還好需要頂上來的view是跟著listview,
    只需要抓listview item高度、畫面高度、複合view高度去算移動位置。
    但必須要監聽到軟鍵盤打開事件才能算高度。
  • 最初找到覺得比較好的解法可能是在 onConfigurationChanged 寫軟鍵盤事件,
    但其實真的寫了發現根本沒用。
    https://stackoverflow.com/questions/24388492/listen-for-keyboard-show-or-hide-event-in-android
  • 就只剩用 addOnGlobalLayoutListener 抓事件,我是覺得不太好,
    因為萬一是其他因素導致布局改變,可能無法精準抓到鍵盤事件。
Code:

1
2
3
4
5
6
7
8
9
10
11
12
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
view.getWindowVisibleDisplayFrame(r);
if (view.getRootView().getHeight() - (r.bottom - r.top) > 500) { // if more than 100 pixels, its probably a keyboard...
onKeyboardShow();
} else {
onKeyboardHidden();
}
}
});

沒有留言:

張貼留言