編輯:關於Android編程
在android開發中,軟鍵盤是一個比較常用的了。總結下來,再也不用去網上搜資料了。
在android中,軟鍵盤原理上是一個dialog,InputMethodService為我們的輸入法創建了一個Dialog,並且對某些參數進行了設置,使之能夠在底部或者全屏顯示。當我們點擊輸入框時,系統會對當前的主窗口進行調整,以便留出相應的空間來顯示該Dialog在底部,或者全屏。
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(view,InputMethodManager.SHOW_FORCED);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0); //強制隱藏鍵盤
在Activity的清單文件中,添加屬性
Android:windowSoftInputMode=”stateHidden”如下:
在你的activity中的oncreate中setContentView之前寫上這個代碼getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
在項目的AndroidManifest.xml文件中界面對應的裡加入android:windowSoftInputMode="stateVisible|adjustResize",這樣會讓屏幕整體上移。
如果加上的是 android:windowSoftInputMode="adjustPan"這樣鍵盤就會覆蓋屏幕。
把頂級的layout替換成ScrollView,或者說在頂級的Layout上面再加一層ScrollView的封裝。這樣就會把軟鍵盤和輸入框一起滾動了,軟鍵盤會一直處於底部。
我們從這個屬性的名稱中,可以很直觀的看出它的作用,這個屬性就是來設置窗口軟鍵盤的交互模式的。android:windowSoftInputMode屬性一共有9個取值,分別是:
【A】stateUnspecified:軟鍵盤的狀態並沒有指定,系統將選擇一個合適的狀態或依賴於主題的設置
【B】stateUnchanged:當這個activity出現時,軟鍵盤將一直保持在上一個activity裡的狀態,無論是隱藏還是顯示
【C】stateHidden:用戶選擇activity時,軟鍵盤總是被隱藏
【D】stateAlwaysHidden:當該Activity主窗口獲取焦點時,軟鍵盤也總是被隱藏的
【E】stateVisible:軟鍵盤通常是可見的
【F】stateAlwaysVisible:用戶選擇activity時,軟鍵盤總是顯示的狀態
【G】adjustUnspecified:默認設置,通常由系統自行決定是隱藏還是顯示
【H】adjustResize:該Activity總是調整屏幕的大小以便留出軟鍵盤的空間
【I】adjustPan:當前窗口的內容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能總是看到輸入內容的部分
我們可以在這9個值裡面選擇一個,也可以用”state…|adjust”的形式進行設置。那麼,下面我們就介紹這9個值到底是如何影響軟鍵盤的顯示的。
中文意思是未指定狀態。當我們沒有設置android:windowSoftInputMode屬性的時候,軟件默認采用的就是這種交互方式,系統會根據界面采取相應的軟鍵盤的顯示模式,並且在不同的手機上,顯示是不同的。比如,當界面上只有文本和按鈕的時候,軟鍵盤就不會自動彈出,因為沒有輸入的必要。那麼,當界面上出現了獲取了焦點的輸入框的時候,軟鍵盤會不會自動的彈出呢?這個還真不一定!比如,在下面的這個界面布局中,有的手機軟鍵盤並不會自動彈出,但有的手機會彈出來的。
就是說,默認的,在這種界面情況下,系統並不確定用戶是否需要軟鍵盤,因此不一定自動彈出。但是,為什麼說不一定呢?這是因為,如果我們在這個布局的外面,包裹上一個ScrollView,軟鍵盤就會自動的彈出來了!
如下,在這種布局文件下,軟鍵盤會自動的彈出
中文的意思就是狀態不改變的意思,我們應該怎麼理解這句話呢?其實很好理解,就是說,當前界面的軟鍵盤狀態,取決於上一個界面的軟鍵盤狀態。舉個例子,假如當前界面鍵盤是隱藏的,那麼跳轉之後的界面,軟鍵盤也是隱藏的;如果當前界面是顯示的,那麼跳轉之後的界面,軟鍵盤也是顯示狀態。這個很好理解。
顧名思義,如果我們設置了這個屬性,那麼鍵盤狀態一定是隱藏的,不管上個界面什麼狀態,也不管當前界面有沒有輸入的需求,反正就是不顯示。因此,我們可以設置這個屬性,來控制軟鍵盤不自動的彈出。但是當輸入框獲取焦點的時候還是會彈出來的,看下面界面:
當我初次打開這個頁面的時候,看到沒,這個輸入框是有焦點的,但是沒有彈出軟鍵盤,但是當你再次點擊輸入框的時候會再次彈出軟鍵盤,下面就是默認不彈出軟鍵盤簡單方法。
用戶選擇activity時,軟鍵盤總是被隱藏,我並不知道和stateHidden的區別
設置為這個屬性,可以將軟鍵盤召喚出來,即使在界面上沒有輸入框的情況下也可以強制召喚出來。
這個屬性也是可以將鍵盤召喚出來,但是與stateVisible屬性有小小的不同之處。舉個例子,當我們設置為stateVisible屬性,如果當前的界面鍵盤是顯示的,當我們點擊按鈕跳轉到下個界面的時候,軟鍵盤會因為輸入框失去焦點而隱藏起來,當我們再次回到當前界面的時候,鍵盤這個時候是隱藏的。但是如果我們設置為stateAlwaysVisible,我們跳轉到下個界面,軟鍵盤還是隱藏的,但是當我們再次回來的時候,軟鍵盤是會顯示出來的。所以,這個Always就解釋了這個區別,不管什麼情況到達當前界面(正常跳轉或者是上一個界面被用戶返回),軟鍵盤都是顯示狀態。
說到這裡,我聯想到了上面的stateHidden和stateAlwaysHidden,我估計區別也是這樣的,就是說,stateAlwaysHidden無論如何都是隱藏的,但是如果在跳轉到下個界面的時候,軟鍵盤被召喚出來了,那麼當下個界面被用戶返回的時候,鍵盤應該是不會被隱藏的,但是,我還沒有找到能夠跳轉到下個界面,還讓當前界面軟鍵盤不消失的方法,所以暫時不能驗證。
默認設置,通常由系統自行決定是隱藏還是顯示,這個屬性,我在手機上搗鼓了半天,沒明白它是做什麼用的,用了解的小伙伴可以告訴我。謝謝。
這個屬性表示Activity的主窗口總是會被調整大小,從而保證軟鍵盤顯示空間。請大家看圖,對於沒有Scrollview的布局,默認屬性時,整個布局是被頂上去了,但是設置為adjustResize屬性,布局的位置並沒有發生什麼變化,而是被覆蓋,我試過不管有沒有ScrolView都是這樣,這就是最大的區別。
當點擊“請輸入文字4”所在的輸入框,效果圖是這樣的:
看到沒,“請輸入文字4”所在的輸入框被覆蓋了。
總結一下:當設置成adjustResize後,軟鍵盤會覆蓋界面,甚至會覆蓋文本框,而不會調整界面大小去顯示輸入框,而且不管有沒有ScrolView都是一樣的。
如果設置為這個屬性,那麼Activity的屏幕大小並不會調整來保證軟鍵盤的空間,而是采取了另外一種策略,系統會通過布局的移動,來保證用戶要進行輸入的輸入框肯定在用戶的視野范圍裡面,從而讓用戶可以看到自己輸入的內容。對於沒有滾動控件的布局來說,這個其實就是默認的設置,如果我們選擇的位置偏下,上面的標題欄和部分控件會被頂上去。但是對於有滾動控件的布局來說,則不太一樣,我們看下面的效果圖。
首先,這是軟鍵盤沒有彈出的時候,有Scroll的顯示范圍。
當我們點擊“請輸入文字4”所在的輸入框,我們會發現下面的現象。 最上面標題欄已經不能看到了。 而且還不能滑動,上下都不能滑動。是不是很奇怪。
通過以上的實驗,我們可以得出結論,如果我們不設置”adjust…”的屬性,對於沒有滾動控件的布局來說,采用的是adjustPan方式,而對於有滾動控件的布局,則是采用的adjustResize方式。了解了上面的這些知識之後,我們就可以根據自己的需求設置不同的方式了。而且,關於如何使得界面加載的時候不顯示軟鍵盤,我們也有了一個很清楚的認識。
android.support.v7.widget.RecyclerViewandroid.support.v7.widget.LinearLayoutManageran
說明: 視圖列表(ListView和ListActivity)與AutoComplete、Spinner類似,它們都需要一個供顯示的列表項,可以需
吹在前面的話:ListView下刷新刷功能相信從事Android開發的猿友們並不陌生,包括現在Google親兒子SwipeRefreshLayout實現效果在一些APP上
一、前言前段時間有個同事離職了,用C編譯的.SO文件需要更改,結果C文件是他寫的,無賴啊,自己又是一個小白,不會啊,所以自己又好好鑽研了一天,不會,看什麼都難啊,痛苦啊,