Android軟鍵盤與界面內容的坑

*******這是開發上個項目時遇到的有點問題,之前寫過筆記,現在整理到博客上*********

1.遇到的問題

*用戶註冊頁面,這個問題基本只要寫過這個頁面都會碰到,註冊頁面有多個EditText用來錄入用戶信息,夠用情況下直接使用一個線性佈局,其他屬性不設置時呼出軟鍵盤,系統會自動幫我們將頁面內容往上推,使當前獲取焦點的輸入框剛好在軟鍵盤上面。這個效果沒有啥問題,但是!當你輸入框很多,屏幕放不下時,把他們全部放入ScrollView,你就會發現底下的輸入框獲取焦點時並不會滾上來了。這時候你就需要關心軟鍵盤輸入模式了。

*項目中直播頁面有聊天互動,如果聊天輸入框獲取焦點時再把內容區域頂出屏幕,那就沒法看了,所以也需要調整軟鍵盤輸入模式。


2.關於軟鍵盤輸入模式的幾個值

stateUnspecified-未指定狀態:當我們沒有設置android:windowSoftInputMode屬性的時候,軟件默認採用的就是這種交互方式,系統會根據界面採取相應的軟鍵盤的顯示模式。


stateUnchanged-不改變狀態:當前界面的軟鍵盤狀態,取決於上一個界面的軟鍵盤狀態,無論是隱藏還是顯示。


stateHidden-隱藏狀態:當設置該狀態時,軟鍵盤總是被隱藏,不管是否有輸入的需求。


stateAlwaysHidden-總是隱藏狀態:當設置該狀態時,軟鍵盤總是被隱藏,和stateHidden不同的是,當我們跳轉到下個界面,如果下個頁面的軟鍵盤是顯示的,而我們再次回來的時候,軟鍵盤就會隱藏起來。


stateVisible-可見狀態:當設置爲這個狀態時,軟鍵盤總是可見的,即使在界面上沒有輸入框的情況下也可以強制彈出來出來。


stateAlwaysVisible-總是顯示狀態:當設置爲這個狀態時,軟鍵盤總是可見的,和stateVisible不同的是,當我們跳轉到下個界面,如果下個頁面軟鍵盤是隱藏的,而我們再次回來的時候,軟鍵盤就會顯示出來。


adjustUnspecified-未指定模式:設置軟鍵盤與軟件的顯示內容之間的顯示關係。當你跟我們沒有設置這個值的時候,這個選項也是默認的設置模式。在這中情況下,系統會根據界面選擇不同的模式。


adjustResize-調整模式:該模式下窗口總是調整屏幕的大小用以保證軟鍵盤的顯示空間;這個選項不能和adjustPan同時使用,如果這兩個屬性都沒有被設置,系統會根據窗口中的佈局自動選擇其中一個。


adjustPan-默認模式:該模式下不會通過調整屏幕大小來保證軟鍵盤的空間,而是採取了另外一種策略,系統會通過佈局的移動,來保證用戶要進行輸入的輸入框肯定在用戶的視野範圍裏面,從而讓用戶可以看到自己輸入的內容。

可以單獨設置一個值或是state值和adjust值組合,使用時在 manifest文件對應activity 聲明屬性 windowSoftInputMode 


3.解決問題

其實軟鍵盤的本質就是一個Dialog,當我們點擊輸入框時,系統對活動主窗口進行調整,從而爲軟鍵盤騰出相應的空間,然後將該Dialog顯示在底部。不設置時是由系統幫我們選取,遇到問題時我們就需要針對自己的情況強制指定了。

*第一個問題很好解決,直接設置Activity的 windowSoftInputMode爲adjustPan 或者adjustResize 都可以使ScrollView滾動 輸入框在軟鍵盤之上,那麼問題來了,這兩種值設置有什麼區別呢?adjustResize-調整模式:該模式下窗口總是調整屏幕的大小用以保證軟鍵盤的顯示空間,調整屏幕大小的意思就是說軟鍵盤呼出以後,實際頁面內容顯示的區域只有鍵盤上面一部分了,就像問題中的,我的ScrollView被擠到了屏幕上半部分,簡單說就是當前頁面大小變小了,但是還能完整顯示頁面,與之對應的adjust模式中,頁面大小沒有被修改,只是被強制滑動,使輸入框剛好滑動到了軟鍵盤上方。這時候如果軟鍵盤覆蓋區域還有內容,你想要在鍵盤呼出狀態下看到下面的內容是不行的。

*第二個問題,效果可以參考所有直播軟件(我們這裏分三個部分,1是VideoView,2是ViewPager做互動區域,3是輸入框 )。根據上面的特性,頁面佈局上這三部分肯定是不能放在一個線性佈局的,不然怎麼調整軟鍵盤都是徒勞。我們在相對佈局中將VideoView和ViewPager作爲內容區,EditText看做一部分,這時候默情況內容區域還是會被頂上去,adjustPan 模式時和默認一樣,只有adjustResize模式下,EditText會被頂起且VideoView不會被移動,達到我們要的效果。那麼我踩的坑在哪呢,我就是按照這個思路設置完以後死活不行,視頻區域一直被滾動上去,在我回頭對比了幾個直播App之後發現原因就是這個:

 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
是的,我設置了全屏,導致軟鍵盤設置模式失效!!!

-------關於全屏模式下adjustResize 失效問題 也已經有了解決方案,搜索 AndroidBug5497Workaround 

-------------------------------

第一篇博客,之前一直把東西記成筆記,簡單方便,不用組織語言,自己看的懂就行,後來發現還是太天真,有些問題時間久了再看自己寫的東西都一臉懵逼,到底還是不能偷懶,重要東西還是要做詳細記錄啊,以後會堅持寫一些東西,以前的筆記,新學的知識什麼的,希望自己能堅持下來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章