Skip to main content
Select a menu in the customizer

Android issue – UI佈局被鍵盤擋住

Screenshot_20170419-012205

其實這問題我也不知道有人看得懂嗎?不過出於自我紀錄的 blog 的概念,寫寫看。主要就是當你輸入 EditText 的時候,通常 android 系統會自動跳出 soft keyboard,方便使用者輸入,但是有些佈局,彈出來的 keyboard 會擋住 EditText 的輸入匡,讓使用者看不到。

老實說這樣的問題,有一百種出現的 UI,就可能會有一百種的問題根源,很多情況下可能要很 UI/UX 的設計師討論。基本上很難有銀彈去解決所有的問題。

我的情況則是如圖所示, 沒有出現鍵盤時,畫面如下,看起來沒有問題。

 

Screenshot_20170419-011818

但是當我點擊 2 號輸入匡後就換自動跑出鍵盤,如下

Screenshot_20170419-012205

有沒有發現,鍵盤畫面擋住了 2 號輸入匡,通常情況如果是使用 RecycleView ,系統會自動滑到 2 號輸入匡,方便使用者輸入,而不是被鍵盤蓋住。不過由於我的佈局稍微複雜一點,搞得不會自動滑過去。不過其實也就是 Activity with ViewPager(RecycleView inside Fragment) and Bottom TabLayout。

如果要談深一點就是

  1. 如果 manifest 有設定:Android:windowSoftInputMode = “adjustResize”, keyboard 出現時 app 會調用 onSizeChanged,所以有些人作法就是在這處理,將畫面物件重新整理。
  2. 也有人做法是利用 OnGlobalLayoutListener 監聽畫面變化,利用畫面高度判斷是否鍵盤有出現嗎?然後重新調整畫面物件配置。

http://stackoverflow.com/questions/2150078/how-to-check-visibility-of-software-keyboard-in-android

final View activityRootView = findViewById(R.id.activityRoot);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();
        if (heightDiff > dpToPx(this, 200)) { // if more than 200 dp, it's probably a keyboard...
            // ... do something here
        }
     }
});

不過老實說,上面兩種做法都需要配合 UI/UX 的鍵盤畫面搭配設計,這應該是最佳解。但是我並沒有那麼多資源,所以只打算做出輸入匡可以自動滑動到使用者能看到的地方。

最後我啥鬼都試過,發現只要 RecycleView 上外層加一個 NestedScrollView,並調整一下 ImageView 的位子就可以達到效果。

螢幕快照 2017-04-19 上午2.09.44

https://developer.android.com/reference/android/support/v4/widget/NestedScrollView.html

感謝各位看到這裡,也只能談到這裡,畢竟這有點個人化的問題。