實現輸入界面適應鍵盤的顯示和隱藏事件

方法1、設置activity的windowSoftInputMode屬性 html

    在AndroidManifest配置activity的windowSoftInputMode爲「adjustResize」,通常能解決問題。 java

    其餘取值說明:
android

    "stateUnspecified" 軟鍵盤的狀態(是否它是隱藏或可見)沒有被指定。系統將選擇一個合適的狀態或依賴於主題的設置。這個是爲了軟件盤行爲默認的設置。
 
    "stateUnchanged" 軟鍵盤被保持不管它上次是什麼狀態,是否可見或隱藏,當主窗口出如今前面時。
 
    "stateHidden" 當用戶選擇該Activity時,軟鍵盤被隱藏——也就是,當用戶肯定導航到該Activity時,而不是返回到它因爲離開另外一個Activity。
 
    "stateAlwaysHidden" 軟鍵盤老是被隱藏的,當該Activity主窗口獲取焦點時。
 
    "stateVisible" 軟鍵盤是可見的,當那個是正常合適的時(當用戶導航到Activity主窗口時)。
 
    "stateAlwaysVisible" 當用戶選擇這個Activity時,軟鍵盤是可見的——也就是,也就是,當用戶肯定導航到該Activity時,而不是返回到它因爲離開另外一個Activity。
 
    "adjustUnspecified" 它不被指定是否該Activity主窗口調整大小以便留出軟鍵盤的空間,或是否窗口上的內容獲得屏幕上當前的焦點是可見的。系統將自動選擇這些模式中一種主要依賴因而否窗口的內容有任何佈局視圖可以滾動他們的內容。若是有這樣的一個視圖,這個窗口將調整大小,這樣的假設可使滾動窗口的內容在一個較小的區域中可見的。這個是主窗口默認的行爲設置。
 
    "adjustResize" 該Activity主窗口老是被調整屏幕的大小以便留出軟鍵盤的空間。
 
    "adjustPan" 該Activity主窗口並不調整屏幕的大小以便留出軟鍵盤的空間。相反,當前窗口的內容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能老是看到輸入內容的部分。這個一般是不指望比調整大小,由於用戶可能關閉軟鍵盤以便得到與被覆蓋內容的交互操做。 app

    參考:http://developer.android.com/guide/topics/manifest/activity-element.html ide

二、動態改變輸入框的位置 佈局

    我開發的app底部有tab,輸入界面在fragment中,須要實現鍵盤顯示輸入界面恰好在鍵盤上,鍵盤隱藏時輸入界面輸入界面在fragment底部。個人activity的windowSoftInputMode屬性爲「adjustPan」。 ui

    (1)、fragment使用到的xml爲RelatvieLayout佈局,而輸入界面沒有和其餘空間有關聯,默認不顯示,位置在頂部。 spa

    (2)、當須要顯示輸入界面時,則顯示,並觸發鍵盤。 code

    

InputView.setVisibility(View.VISIBLE);
EditText.setFocusable(true);
EditText.setFocusableInTouchMode(true);
EditText.requestFocus();



    (3)、顯示鍵盤後計算數據界面的新位置。     xml

    

Rect fragmentWindowRect = new Rect();
Rect fragmentLocalRect = new Rect();
Rect inputViewRect = new Rect();
//顯示Fragment的可見區域
//若鍵盤在隱藏狀態,會返回全屏幕的尺寸
//若鍵盤在顯示狀態,會返回除鍵盤之外的尺寸,這是我想要的
FragmentView.getWindowVisibleDisplayFrame(fragmentWindowRect);
//獲取Fragment在activity上顯示區域
//不管鍵盤是否顯示,值都同樣
FragmentView.getLocalVisibleRect(fragmentLocalRect);
//獲取輸入界面的位置和大小
InputView.getLocalVisibleRect(inputViewRect);

 //
int inputViewHeight = inputViewRect.bottom - inputViewRect.top;
int targetBottom = Math.min(fragmentLocalRect.bottom, fragmentWindowRect.bottom);
int top = targetBottom - inputViewHeight;

InputView.layout(0, top, inputViewRect.right, targetBottom);



    (4)、鍵盤隱藏後再結算新位置。

       再次調用上面的方法。

相關文章
相關標籤/搜索