一、背景
打開橫屏應用,點擊云機EditText輸入框,輸入框被鍵盤遮擋,如下圖:
未打開鍵盤狀態:
點擊第二個輸入框,鍵盤遮擋了輸入框:
二、解決方案(推薦第三中方案,博主采用的也是第三種方案)
博主這里整理了三種方案:
1、點擊時,云機透傳出來Y坐標值,真機計算鍵盤高度,通過高度,滑動鍵盤,避免遮擋,但有些游戲會有問題,需要大量適配;
2、第二種設置輸入法為懸浮小鍵盤,避免遮擋,但這種方案有些輸入法會不生效,得看輸入法是不是支持設置,效果如下:
3、拿到真機的觸控坐標,在調用鍵盤前,設置EditText的焦點為該坐標點,云機鍵盤彈出的時候,就是根據該焦點去彈鍵盤,具體方法如下:
(1)、在Acvitity中設置以下屬性
android:windowSoftInputMode="adjustPan"
(2)、在dispatchTouchEvent中拿到坐標
注意:注意,坐標點要在分發的時候拿,因為云機的觸控是在onTouchEvent中去處理的,所以,要在鍵盤彈出前設置EditText的位置,這個很重要
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {val action = ev.actionif (action == MotionEvent.ACTION_DOWN){val touchX = ev.xval touchY = ev.y//設置EditText Y軸方向位置,用于鍵盤彈出,避免遮擋val params = mEdtKeyboard!!.getLayoutParams() as ViewGroup.MarginLayoutParamsparams.topMargin=touchY.toInt()mEdtKeyboard!!.setLayoutParams(params)// 請求重新布局mEdtKeyboard!!.requestLayout()}return super.dispatchTouchEvent(ev)}
在布局中放了一個EditText占位:
<EditTextandroid:id="@+id/edt_keyboard_input"android:layout_width="@dimen/dp_2"android:layout_height="@dimen/dp_2"android:imeOptions="flagNoFullscreen" //設置鍵盤不滿屏/>
修改后效果: