android軟鍵盤彈出引發的各類不適終極解決方案

不少寫登陸界面的開發者都會遇到一個問題:那就是在登陸界面時,當你點擊輸入框時,下邊的按鈕有時會被輸入框擋住,這個不利於用戶的體驗,因此不少人但願軟鍵盤彈出時,也能把按鈕擠上去。不少開發者想要監聽鍵盤的狀態,這無疑是一個很麻煩的作法。html

       咱們能夠在AndroidManifest.xml的Activity設置屬性:android:windowSoftInputMode = "adjustResize" ,軟鍵盤彈出時,要對主窗口布局從新進行佈局,並調用onSizeChanged方法,切記一點當咱們設置爲「adjustResize」時,咱們的界面不要設置爲全屏模式,不然設置了這個屬性也不會有什麼效果。而當咱們設置android: windowSoftInputMode = "adjustPan"時,主窗口就不會調用onSizeChanged方法,界面的一部分就會被軟鍵盤覆蓋住,就不會被擠到軟鍵盤之上了。java

咱們經過一段代碼來測試一下,當咱們設置了該屬性後,彈出輸入法時,系統作了什麼:android

重寫Layout佈局:ide

 
  1. [java] view plaincopyprint?佈局


    1. public class ResizeLayout extends LinearLayout{   測試

    2.     private static int count = 0;   spa

    3.        

    4.     public ResizeLayout(Context context, AttributeSet attrs) {   .net

    5.         super(context, attrs);   調試

    6.     }   code

    7.        

    8.     @Override   

    9.     protected void onSizeChanged(int w, int h, int oldw, int oldh) {       

    10.         super.onSizeChanged(w, h, oldw, oldh);   

    11.            

    12.         Log.e("onSizeChanged " + count++, "=>onResize called! w="+w + ",h="+h+",oldw="+oldw+",oldh="+oldh);   

    13.     }   

    14.        

    15.     @Override   

    16.     protected void onLayout(boolean changed, int l, int t, int r, int b) {   

    17.         super.onLayout(changed, l, t, r, b);   

    18.         Log.e("onLayout " + count++, "=>OnLayout called! l=" + l + ", t=" + t + ",r=" + r + ",b="+b);   

    19.     }   

    20.        

    21.     @Override   

    22.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {   

    23.         super.onMeasure(widthMeasureSpec, heightMeasureSpec);   

    24.            

    25.         Log.e("onMeasure " + count++, "=>onMeasure called! widthMeasureSpec=" + widthMeasureSpec + ", heightMeasureSpec=" + heightMeasureSpec);   

    26.     }   


咱們的佈局設置爲:

 
  1. [html] view plaincopyprint?


    1. <com.winuxxan.inputMethodTest.ResizeLayout    

    2.     xmlns:android="http://schemas.android.com/apk/res/android"   

    3.     android:id="@+id/root_layout"   

    4.     android:layout_width="fill_parent"   

    5.     android:layout_height="fill_parent"   

    6.     android:orientation="vertical"   

    7.     >   

    8.        

    9.     <EditText   

    10.         android:layout_width="fill_parent"    

    11.         android:layout_height="wrap_content"    

    12.     />   

    13.      

    14.     <LinearLayout   

    15.             android:id="@+id/bottom_layout"   

    16.             android:layout_width="fill_parent"    

    17.             android:layout_height="fill_parent"    

    18.             android:orientation="vertical"   

    19.             android:gravity="bottom">s   

    20.       

    21.     <TextView     

    22.         android:layout_width="fill_parent"    

    23.         android:layout_height="wrap_content"    

    24.         android:text="@string/hello"   

    25.         android:background="#77777777"   

    26.       />   

    27.    </LinearLayout>   

    28. </com.winuxxan.inputMethodTest.ResizeLayout>   


AndroidManifest.xml的Activity設置屬性:android:windowSoftInputMode = "adjustResize"
    運行程序,點擊文本框,查看調試信息:
    E/onMeasure 6(7960): =>onMeasure called! widthMeasureSpec=1073742144, heightMeasureSpec = 1073742024
    E/onMeasure 7(7960): =>onMeasure called! widthMeasureSpec=1073742144, heightMeasureSpec = 1073742025
    E/onSizeChanged 8(7960): =>onSizeChanged called! w=320,h=201,oldw=320,oldh=377
    E/onLayout 9(7960): =>OnLayout called! l=0, t=0,r=320,b=201
    從調試結果咱們能夠看出,當咱們點擊文本框後,根佈局調用了onMeasure,onSizeChanged和onLayout。

  windowSoftInputMode的值若是設置爲adjustPan,那麼該Activity主窗口並不調整屏幕的大小以便留出軟鍵盤的空間。相反,當前窗口的內容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能老是看到輸入內容的部分。這個一般是不指望比調整大小,由於用戶可能關閉軟鍵盤以便得到與被覆蓋內容的交互操做。
    上面的例子中,咱們將AndroidManifest.xml的屬性進行更改:android: windowSoftInputMode = "adjustPan"

    從新運行,並點擊文本框,查看調試信息:
    E/onMeasure 6(8378): =>onMeasure called! widthMeasureSpec=1073742144, heightMeasureSpec=1073742200
    E/onMeasure 7(8378): =>onMeasure called! widthMeasureSpec=1073742144, heightMeasureSpec=1073742201
    E/onLayout 8(8378): =>OnLayout called! l=0, t=0,r=320,b=377
    咱們看到:系統也從新進行了measrue和layout,可是咱們發現,layout過程當中onSizeChanged並無調用,這說明輸入法彈出先後並無改變原有佈局的大小。

固然還有其餘屬性能夠設置:

"stateUnspecified"

軟鍵盤的狀態(是否它是隱藏或可見)沒有被指定。系統將選擇一個合適的狀態或依賴於主題的設置。

這個是爲了軟件盤行爲默認的設置。

"stateUnchanged"

軟鍵盤被保持不管它上次是什麼狀態,是否可見或隱藏,當主窗口出如今前面時。

"stateHidden"

當用戶選擇該Activity時,軟鍵盤被隱藏——也就是,當用戶肯定導航到該Activity時,而不是返回到它因爲離開另外一個Activity。

"stateAlwaysHidden"

軟鍵盤老是被隱藏的,當該Activity主窗口獲取焦點時。

"stateVisible"

軟鍵盤是可見的,當那個是正常合適的時(當用戶導航到Activity主窗口時)。

"stateAlwaysVisible"

當用戶選擇這個Activity時,軟鍵盤是可見的——也就是,也就是,當用戶肯定導航到該Activity時,而不是返回到它因爲離開另外一個Activity。

"adjustUnspecified"

它不被指定是否該Activity主窗口調整大小以便留出軟鍵盤的空間,或是否窗口上的內容獲得屏幕上當前的焦點是可見的。系統將自動選擇這些模式中一種主要依賴因而否窗口的內容有任何佈局視圖可以滾動他們的內容。若是有這樣的一個視圖,這個窗口將調整大小,這樣的假設可使滾動窗口的內容在一個較小的區域中可見的。這個是主窗口默認的行爲設置。

"adjustResize"

該Activity主窗口老是被調整屏幕的大小以便留出軟鍵盤的空間

"adjustPan"

該Activity主窗口並不調整屏幕的大小以便留出軟鍵盤的空間。相反,當前窗口的內容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能老是看到輸入內容的部分。這個一般是不指望比調整大小,由於用戶可能關閉軟鍵盤以便得到與被覆蓋內容的交互操做。

相關文章
相關標籤/搜索