android輸入框自動頂上去問題解決。
頂部有一個原生的ActionBar
和一個自定義的ActionBar
,然後中間一段內容,最下面有一個EditText
;當EditText
獲取焦點時,會彈出軟鍵盤:注意到頂部的原生ActionBar
和我自定義的ActionBar
被軟鍵盤給頂出去了...我想要的效果是,頂部的兩個ActionBar
保持不動,然後下面的Content被頂上去,同時被ActionBar
覆蓋掉頂上去的那部分。
網上有一種解決方法說是給Activity
設定android:windowSoftInputMode="adjustPan"
,我試過,不管用。
百度了一下:Android SDK目前提供的軟鍵盤彈出模式介面只有兩種,一是彈出時自動衝回介面,將所有元素上頂,另一種則是不重繪介面,直接將控制元件元素遮住,沒有其他模式,如果想實現其他效果,光使用系統介面是不行的
實際上這類問題很容易解決,網上已經有很多貼子討論過這個問題,針對我這種情況,寫下這篇文章總結一下這個問題。
解決方法
解決問題的關鍵就在於ScrollView
:給想要被頂上去的內容(包括下面那個EditText
)巢狀一個ScrollView
:
圖中紅色的框就是ScrollView
應該在頁面中所處的位置。
上佈局程式碼:
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width= "match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="#FFFF6702"
android:gravity="center"
android:text="Custom ActionBar"
android:textColor="@android:color/white"
android:textSize="20sp" />
<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" >
<TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="#FF33B5E5"
android:gravity="center"
android:text="Content"
android:textColor="@android:color/white"
android:textSize="50sp" />
<EditText
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="50dp"
android:text="EditText" />
</LinearLayout>
</ScrollView>
</LinearLayout>
如果不出意外,到這裡這個問題已經解決了。
可是我在這裡遇到了一個坑...我還沒有解決這個問題。最後我發現我的ScrollView
設定了一個android:scrollbars="none"
屬性,把這個屬性去掉問題就解決了...不太明白為什麼,貌似涉及底層程式碼,觀摩不到...
可是作為一個強迫症小青年,我偏不想去掉這個屬性,怎麼辦?
我神奇的發現在Activity
的setContentView()
方法後面新增一條這樣的語句,問題就解決了...getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
下面我就來分析一下這個android:windowSoftInputMode
屬性
android:windowSoftInputMode
這個屬性用於設定Activity
主視窗與軟鍵盤的互動模式,可以用來避免軟鍵盤面板遮擋內容的問題。
這個屬效能影響兩件事:
- 當有焦點產生時,軟鍵盤是隱藏還是顯示
- 是否調整
Activity
主視窗大小以便騰出空間放軟鍵盤
它的設定必須是下面列表中的一個值,或一個"state"值加一個"adjust"值的組合,各個值之間用 | 分開。
- stateUnspecified:預設狀態,系統將選擇一個合適的狀態或依賴於主題的設定。
- stateUnchanged:當這個
Activity
出現時,軟鍵盤將一直保持上一個Activity
裡的狀態,無論是隱藏還是顯示。 - stateHidden:當這個
Activity
出現時,軟鍵盤總是被隱藏。 - stateAlwaysHidden:當這個
Activity
主視窗獲取焦點時,軟鍵盤總是被隱藏。 - stateVisible:當這個
Activity
出現時(Activity
中有可以獲取輸入焦點的控制元件),軟鍵盤通常是可見的。 - stateAlwaysVisible:當這個
Activity
出現時,軟鍵盤總是彈出。 - adjustUnspecified:預設行為,系統將根據視窗中的佈局自動調整視窗大小。
- adjustResize:這個
Activity
主視窗總是調整螢幕的大小以便留出軟鍵盤的空間;這個選項不能和adjustPan同時使用,如果這兩個屬性都沒有被設定,系統會根據視窗中的佈局自動選擇其中一個。 - adjustPan:這個
Activity
主視窗並不調整螢幕的大小以便留出軟鍵盤的空間;相反,當前視窗中獲取輸入焦點的控制元件會自動移動到軟鍵盤上方以便使用者總是能看到輸入內容的部分;這個選項不能和adjustPan同時使用,如果這兩個屬性都沒有被設定,系統會根據視窗中的佈局自動選擇其中一個。
現在再回過頭來看看我遇到的那個問題;我的猜測是沒有設定android:windowSoftInputMode
屬性的主視窗會在彈出軟鍵盤時檢測當前需要做調整的佈局中是否嵌套了ScrollView
,再判斷ScrollView
是否設定了android:scrollbars="none"
屬性,如果設定了則不允許通過滾動ScrollView
中的Content來達到調整螢幕內容留出用於放置軟鍵盤空間的效果。
參考: