android虚拟键盘挡住布局,让Android软键盘不遮挡布局
在Android UI中,我們常常會(huì)使用EditText,比如在一個(gè)ScrollView中放置多個(gè)EditText,如下圖:
帶有edittext的scrollview.png
當(dāng)用戶點(diǎn)擊這個(gè)EditText時(shí)會(huì)觸發(fā)軟鍵盤,這個(gè)軟鍵盤會(huì)把EditText以下的界面擋住:
被edittext遮擋的scrollview.png
android:windowSoftInputMode
Activity 的主窗口與包含屏幕軟鍵盤的窗口的交互方式。 該屬性的設(shè)置影響兩個(gè)方面:
當(dāng) Activity 成為用戶注意的焦點(diǎn)時(shí)軟鍵盤的狀態(tài) — 隱藏還是可見。
對(duì) Activity 主窗口所做的調(diào)整 — 是否將其尺寸調(diào)小來(lái)為軟鍵盤騰出空間,或者當(dāng)窗口部分被軟鍵盤遮擋時(shí)是否平移其內(nèi)容以使當(dāng)前焦點(diǎn)可見。
注意:該設(shè)置必須是下表所列的值之一,或者是一個(gè)“state...”值加上一個(gè)“adjust...”值的組合。在任一組中設(shè)置多個(gè)值(例如,多個(gè)“state...”值)都會(huì)產(chǎn)生未定義結(jié)果。各值之間使用垂直條 (|) 分隔。例如:
值
說(shuō)明
"stateUnspecified"
不指定軟鍵盤的狀態(tài)(隱藏還是可見)。 將由系統(tǒng)選擇合適的狀態(tài),或依賴主題中的設(shè)置。這是對(duì)軟鍵盤行為的默認(rèn)設(shè)置。
“stateUnchanged”
當(dāng) Activity 轉(zhuǎn)至前臺(tái)時(shí)保留軟鍵盤最后所處的任何狀態(tài),無(wú)論是可見還是隱藏。
“stateHidden”
當(dāng)用戶選擇 Activity 時(shí) — 也就是說(shuō),當(dāng)用戶確實(shí)是向前導(dǎo)航到 Activity,而不是因離開另一 Activity 而返回時(shí) — 隱藏軟鍵盤。
“stateAlwaysHidden”
當(dāng) Activity 的主窗口有輸入焦點(diǎn)時(shí)始終隱藏軟鍵盤。
“stateVisible”
在正常的適宜情況下(當(dāng)用戶向前導(dǎo)航到 Activity 的主窗口時(shí))顯示軟鍵盤。
“stateAlwaysVisible”
當(dāng)用戶選擇 Activity 時(shí) — 也就是說(shuō),當(dāng)用戶確實(shí)是向前導(dǎo)航到 Activity,而不是因離開另一 Activity 而返回時(shí) — 顯示軟鍵盤。
“adjustUnspecified”
不指定 Activity 的主窗口是否調(diào)整尺寸以為軟鍵盤騰出空間,或者窗口內(nèi)容是否進(jìn)行平移以在屏幕上顯露當(dāng)前焦點(diǎn)。 系統(tǒng)會(huì)根據(jù)窗口的內(nèi)容是否存在任何可滾動(dòng)其內(nèi)容的布局視圖來(lái)自動(dòng)選擇其中一種模式。 如果存在這樣的視圖,窗口將進(jìn)行尺寸調(diào)整,前提是可通過(guò)滾動(dòng)在較小區(qū)域內(nèi)看到窗口的所有內(nèi)容。這是對(duì)主窗口行為的默認(rèn)設(shè)置。
“adjustResize”
始終調(diào)整 Activity 主窗口的尺寸來(lái)為屏幕上的軟鍵盤騰出空間。
“adjustPan”
不調(diào)整 Activity 主窗口的尺寸來(lái)為軟鍵盤騰出空間, 而是自動(dòng)平移窗口的內(nèi)容,使當(dāng)前焦點(diǎn)永遠(yuǎn)不被鍵盤遮蓋,讓用戶始終都能看到其輸入的內(nèi)容。 這通常不如尺寸調(diào)正可取,因?yàn)橛脩艨赡苄枰P(guān)閉軟鍵盤以到達(dá)被遮蓋的窗口部分或與這些部分進(jìn)行交互。
從上表可以知道Activity的windowSoftInputMode默認(rèn)是stateUnspecified|adjustUnspecified。這樣我們就可以理解在scrollview中edittext會(huì)通過(guò)滾動(dòng)在較小區(qū)域內(nèi)看到窗口的所有內(nèi)容,即表現(xiàn)為和adjustResize一樣。
解決方案
修改受影響的activity的windowSoftInputMode屬性
android:name=".mall.TeaDetailsActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize" />
然后設(shè)置EditText的點(diǎn)擊事件
et.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
getKeyboardHeight();
}
});
判斷軟鍵盤是否彈出
private void getKeyboardHeight() {
//注冊(cè)布局變化監(jiān)聽
getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//判斷窗口可見區(qū)域大小
Rect r = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
//如果屏幕高度和Window可見區(qū)域高度差值大于整個(gè)屏幕高度的1/3,則表示軟鍵盤顯示中,否則軟鍵盤為隱藏狀態(tài)。
int heightDifference = screenHeight - (r.bottom - r.top);
boolean isKeyboardShowing = heightDifference > screenHeight / 3;
if (isKeyboardShowing) {
changeScrollView();
//移除布局變化監(jiān)聽
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
getWindow().getDecorView().getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
getWindow().getDecorView().getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
}
}
});
}
使ScrollView滾動(dòng)到底部
private void changeScrollView() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//將ScrollView滾動(dòng)到底
mScrollView.fullScroll(View.FOCUS_DOWN);
}
}, 100);
}
這樣,我們的軟鍵盤就會(huì)顯示成如下圖:
軟鍵盤顯示在布局之下.png
然而,這樣還有個(gè)問(wèn)題,就是第一個(gè)輸入框被遮擋住了,我們可以考慮使用scrollTo方法讓ScrollView只滑動(dòng)到EditText的頭部位置。
修改changeScrollView方法:
private void changeScrollView() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mScrollView.scrollTo(0, mScrollView.getChildAt(0).getHeight() - ll4.getHeight() - sll.getHeight());
}
}, 100);
}
注意:mScrollView.getHeight()方法并不能獲取到ScrollView的總高度,想要獲取ScrollView的總高度可以使用mScrollView.getChildAt(0).getHeight()
如下圖:
軟鍵盤顯示在布局之下并不遮擋輸入框.png
總結(jié)
以上是生活随笔為你收集整理的android虚拟键盘挡住布局,让Android软键盘不遮挡布局的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 神经网络的三生三世
- 下一篇: Android 加密