EditText與虛擬鍵盤——開發記錄
開發記錄,使用虛擬鍵盤常用的一些小技巧,開發中遇到一些坑。
前言:EditText控制元件 和 虛擬鍵盤在開發中時常使用到,在一些特殊場景EditText的使用並不像我們所想的那麼順心,今天開發中就遇到一些問題,一般問題百度均可解決,但是很耽擱時間。所以就把所需使用到小技巧記錄下來,以便之後使用。
問題一:虛擬鍵盤 手動開啟,關閉。
問題二:鍵盤頂起底部控制元件;
問題二:popupwindow內輸入框遮擋問題;
1、虛擬鍵盤彈出與隱藏;
Android中軟鍵盤的管理主要是通過InputMethodManager類來完成的。
InputMethodManager物件的獲取方法如下
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
手動彈出:
mEditText. requestFocus();
if (null!=inputManager){
inputManager.showSoftInput(mEditText, InputMethodManager.SHOW_FORCED);
}
AIP詳解:
第一個引數 中view必須是EditText,或者EditText的子類,如果是其他型別的View,如Button,TextView等,showSoftInput()方法不起作用。並且 第一個引數中view 必須已經獲取到焦點(即 view.isFocused() 返回true),如果當前焦點不在該view上,則方法showSoftInput()不起作用,雖然EditText預設是可以獲取焦點的,但是由於一個佈局可能會有多個控制元件可以獲取焦點,焦點位置不一定恰好在你控制的 EditText上,所以 之前可以呼叫 view.requestFocus();獲取焦點
踩坑: showSoftInPut() 方法必須在佈局載入完畢之後才能生效。所以如果你在onCreatView() 中直接呼叫,可能會不起作用;
android:windowSoftInputMode
手動關閉:
if (null!= inputManager){
inputManager.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);
}
AIP詳解:
第一個引數是一個 IBinder ,可以直接傳遞一個 View.getWindowToken()
的 windowToken 物件就可以了。而第二個引數,就是隱藏軟鍵盤的標誌位,如果沒有特殊要求的話,直接傳遞 0 就好了。
注意:這裡雖然原則上需要傳遞一個之前彈出鍵盤傳遞的時候,傳遞的 View 的 windowToken ,但是實際情況是你只需要傳遞一個存在於當前佈局 ViewTree 中,隨意一個 View 的 windowToken 就可以了。
2、鍵盤頂起底部控制元件;
方法一:在清單檔案 宣告Activity節點中加入屬性 <activity android:windowSoftInputMode="ajustResize" ... >
方法二: android:windowSoftInputMode="stateUnchanged|adjustPan"
踩坑: 這樣啟用鍵盤,會緊挨著Editext控制元件底部。
解決:不在清單檔案設定任何屬性,而是是 佈局檔案XML中想辦法
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/background"
android:id="@+id/rv_root"
>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<...>
</LinearLayout>
</ScrollView>
<include
android:id="@+id/view_pay"
android:visibility="gone"
layout="@layout/dialog_pay"/>
</RelativeLayout>
使用相對佈局,整個螢幕顯示內容使用ScrollView 巢狀, 底部需被鍵盤頂起空間放在外側:
解決方法二:
/**
* @param root 最外層佈局,需要調整的佈局
* @param scrollToView 被鍵盤遮擋的scrollToView,滾動root,使scrollToView在root可視區域的底部
*/
private void controlKeyboardLayout(final View root, final View scrollToView) {
root.getViewTreeObserver().addOnGlobalLayoutListener( new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect rect = new Rect();
//獲取root在窗體的可視區域
root.getWindowVisibleDisplayFrame(rect);
//獲取root在窗體的不可視區域高度(被其他View遮擋的區域高度)
int rootInvisibleHeight = root.getRootView().getHeight() - rect.bottom;
//若不可視區域高度大於100,則鍵盤顯示
if (rootInvisibleHeight > 100) {
int[] location = new int[2];
//獲取scrollToView在窗體的座標
scrollToView.getLocationInWindow(location);
//計算root滾動高度,使scrollToView在可見區域的底部
int srollHeight = (location[1] + scrollToView.getHeight()) - rect.bottom;
root.scrollTo(0, srollHeight);
} else {
//鍵盤隱藏
root.scrollTo(0, 0);
}
}
});
使用解決方法二採坑: 整體佈局上移,目的(外部 view不上移,底部推上) 目前採用 方法一,方法二 先留個坑吧開發任務太緊。抓緊趕進度中。
擴充套件:
windowSoftInputMode各值的含義:【1】stateUnspecified:軟鍵盤的狀態並沒有指定,系統將選擇一個合適的狀態或依賴於主題的設定
【2】stateUnchanged:當這個activity出現時,軟鍵盤將一直保持在上一個activity裡的狀態,無論是隱藏還是顯示
【3】stateHidden:使用者選擇activity時,軟鍵盤總是被隱藏
【4】stateAlwaysHidden:當該Activity主視窗獲取焦點時,軟鍵盤也總是被隱藏的
【5】stateVisible:軟鍵盤通常是可見的
【6】stateAlwaysVisible:使用者選擇activity時,軟鍵盤總是顯示的狀態
【7】adjustUnspecified:預設設定,通常由系統自行決定是隱藏還是顯示
【8】adjustResize:該Activity總是調整螢幕的大小以便留出軟鍵盤的空間
【9】adjustPan:當前視窗的內容將自動移動以便當前焦點從不被鍵盤覆蓋和使用者能總是看到輸入內容的部分
3、popupwindow內輸入框遮擋問題;
popupwindow.setSoftInputMode(PopupWindow.INPUT_METHOD_NEEDED);popupwindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
PS:少說多聽,問題,解決是財富。迴避是隱患。