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