Android輸入法覆蓋App彈窗問題

最近項目需求用到彈窗,但是在彈窗里有EditText,從而引發(fā)系統(tǒng)輸入法覆蓋彈窗的問題,值此記錄下。

網(wǎng)上很多關(guān)于布局或者ScrollView的解決方案,但是木有起作用。最終從這篇博客里得到靈感,貼下鏈接

android 解決輸入法鍵盤遮蓋布局問題 - kobe8 - 博客園。

不過實踐中有個細節(jié)不足,此文做下補充。

/**

* @param root 最外層布局,需要調(diào)整的布局

* @param scrollToView 被鍵盤遮擋的scrollToView,滾動root,使scrollToView在root可視區(qū)域的底部

*/

private void controlKeyboardLayout(final View root, final View scrollToView) {

root.getViewTreeObserver().addOnGlobalLayoutListener( new OnGlobalLayoutListener() {

@Override

public void onGlobalLayout() {

Rect rect = new Rect();

//獲取root在窗體的可視區(qū)域

root.getWindowVisibleDisplayFrame(rect);

//獲取root在窗體的不可視區(qū)域高度(被其他View遮擋的區(qū)域高度)

int rootInvisibleHeight = root.getRootView().getHeight() - rect.bottom;

//若不可視區(qū)域高度大于100,則鍵盤顯示

if (rootInvisibleHeight > 100) {

int[] location = new int[2];

//獲取scrollToView在窗體的坐標

scrollToView.getLocationInWindow(location);

//計算root滾動高度,使scrollToView在可見區(qū)域的底部

int srollHeight = (location[1] + scrollToView.getHeight()) - rect.bottom;

root.scrollTo(0, srollHeight);

} else {

//鍵盤隱藏

root.scrollTo(0, 0);

}

}

});

}


//獲取root在窗體的可視區(qū)域

root.getWindowVisibleDisplayFrame(rect);

如果root的寬高是match_parent,那獲取的可視區(qū)域不包括頂部狀態(tài)欄和底部的導(dǎo)航欄(有的手機顯示上木有導(dǎo)航欄,但是會有導(dǎo)航欄的高度)的。

可以通過一下代碼拿導(dǎo)航欄高度

/**

*@paramcontext

*@return

*/

public static intgetNavigationBarHeight(Context context) {

Resources resources = context.getResources();

intresourceId = resources.getIdentifier("navigation_bar_height","dimen","android");

intheight = resources.getDimensionPixelSize(resourceId);

returnheight;

}


所以在系統(tǒng)輸入法沒有彈出來的時候,會發(fā)現(xiàn)

//獲取root在窗體的不可視區(qū)域高度(被其他View遮擋的區(qū)域高度)

int rootInvisibleHeight = root.getRootView().getHeight() - rect.bottom;

拿到的是144而不是100,從而前文的if條件成立,導(dǎo)致多余的Scroll。其實在初始情況下,rootInvisibleHeight的值就是手機底部導(dǎo)航欄的高度。

所以,判斷輸入法是否彈出的條件是rootInvisibleHeight>NavigationBarHeight,而不是100這個臆想的值。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、基本介紹 市場上基本的應(yīng)用都會有登錄,登錄作為一個灰常重要的頁面,給用戶的第一感覺一定要簡潔美觀,最關(guān)鍵還要體...
    CoderChao閱讀 5,117評論 0 27
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 7,311評論 0 17
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,872評論 25 709
  • 也是到后來才明白,可后悔已經(jīng)沒有任何用了。 上了個二本的學(xué)校,學(xué)校環(huán)境差。差指的很多方面,學(xué)校的學(xué)習(xí)氛圍,學(xué)校的學(xué)...
    喬伊晗閱讀 332評論 2 1
  • jlnbda3488375閱讀 466評論 0 3

友情鏈接更多精彩內(nèi)容