輸入法與窗口交互

1.我們在項目中經(jīng)常會遇到軟鍵盤遮擋頁面,輸入框或者軟鍵盤自動彈出的場景,在Android中Activity給我們提供了一個屬性<b>”windowSoftInputMode“</b>,專治輸入法對布局造成一系列的影響,我們只需要在<b>AndroidManifest.xml</b>文件中的activity中設(shè)置android:windowSoftInputMode屬性可以很好解決上面所說的問題。

<activity android:name=".SecondActivity"
        android:windowSoftInputMode="屬性值"/>

2.windowSoftInputMode屬性的取值:
該屬性一共有<b>9種</b>取值,分別為:

  • stateUnspecified
  • stateUnchanged
  • stateHidden
  • stateAlwaysHidden
  • stateVisible
  • stateAlwaysVisible
  • adjustUnspecified
  • adjustResize
  • adjustPan。
    下面通過例子來演示每個屬性值的作用

第一部分:設(shè)置軟鍵盤的顯示與隱藏

1.stateUnspecified

中文意思是未指定狀態(tài),Activity默認采用的就是這種交互方式,系統(tǒng)會根據(jù)界面采取相應(yīng)的軟鍵盤的顯示模式,當(dāng)界面上只有文本和按鈕的時候,軟鍵盤就不會自動彈出,因為沒有輸入的必要;當(dāng)界面上出現(xiàn)了獲取了焦點的輸入框的時候,又分為兩種情況:

  • 1.第一種:有可輸入的控件,但是頁面不能滾動(不能自動彈出,需要點擊輸入框)
  • 2.第二種:有可輸入的控件并且頁面可以滾動(能夠自動彈出)在上面的基礎(chǔ)上在布局中加上一個ScrollView,是頁面能夠滾動
stateUnspecified

因此,我們可以得出結(jié)論,當(dāng)設(shè)置屬性為<b>stateUnspecified</b>的時候,系統(tǒng)是默認不彈出軟鍵盤的,但是當(dāng)有獲得焦點的輸入框的界面有滾動的需求的時候,會自動彈出軟鍵盤。至于為什么非要強調(diào)要獲取焦點的輸入框,這是因為,如果不是輸入框獲取焦點,軟鍵盤也是不會自動彈出的,讓界面不自動彈出軟鍵盤的其中一個解決方案,就是在xml文件中,設(shè)置一個非輸入框控件獲取焦點,從而阻止鍵盤彈出。

2.stateUnchanged

中文的意思就是狀態(tài)不改變的意思,作用就是當(dāng)前界面的軟鍵盤狀態(tài),取決于上一個界面的軟鍵盤狀態(tài)。也就是說假如當(dāng)前界面鍵盤是隱藏的,那么跳轉(zhuǎn)之后的界面,軟鍵盤也是隱藏的;如果當(dāng)前界面是顯示的,那么跳轉(zhuǎn)之后的界面,軟鍵盤也是顯示狀態(tài)。

<!-- 第一個Actiivty為默認的,頁面能夠滾動-->
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <!-- 第二個Activity:軟件盤狀態(tài)跟隨上一個頁面-->
    <activity android:name=".SecondActivity"
        android:windowSoftInputMode="stateUnchanged"/>
stateUnchanged

設(shè)置為該屬性,軟鍵盤的狀態(tài)會跟著上一個頁面走,即使當(dāng)前的頁面沒有可輸入的控件。

3.stateHidden

顧名思義,如果我們設(shè)置了這個屬性,那么鍵盤狀態(tài)一定是隱藏的,不管上個界面什么狀態(tài),也不管當(dāng)前界面有沒有輸入的需求,反正就是不顯示。因此,我們可以設(shè)置這個屬性,來控制軟鍵盤不自動的彈出

 <!-- 第二個Activity:隱藏軟鍵盤-->
 <activity android:name=".SecondActivity"
        android:windowSoftInputMode="stateHidden"/>
stateHidden

4.stateAlwaysHidden

這個屬性也可以讓軟鍵盤隱藏,目前測試跟stateHidden的效果一樣,還沒有測試出兩者的區(qū)別。

5.stateVisible

設(shè)置為這個屬性,可以強制將軟鍵盤出來,即使在界面上沒有輸入框的情況下。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.yt.demo.MainActivity">

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="20sp"
    android:text="沒有可輸入的控件"
    android:gravity="center"/>
</LinearLayout>
stateVisible

6.stateAlwaysVisible

這個屬性也是可以將鍵盤強制顯示出來,與stateVisible屬性不同之處在于:當(dāng)我們設(shè)置為stateVisible屬性,如當(dāng)我們點擊按鈕跳轉(zhuǎn)到下個界面的時候,軟鍵盤會因為輸入框失去焦點而隱藏起來,當(dāng)我們再次回到當(dāng)前界面的時候,鍵盤這個時候是隱藏的。但是如果我們設(shè)置為stateAlwaysVisible,我們跳轉(zhuǎn)到下個界面,再次回來的時候,軟鍵盤是會顯示出來的。

 <activity android:name=".MainActivity"
        android:windowSoftInputMode="stateAlwaysVisible">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".SecondActivity" />
stateAlwaysVisible

第二部分:設(shè)置軟鍵盤與顯示內(nèi)容間的關(guān)系

1.adjustUnspecified

該屬性是默認的設(shè)置模式。在這中情況下,系統(tǒng)會根據(jù)界面選擇不同的模式。如果界面里面有可以滾動的控件,比如ScrowView,系統(tǒng)會減小可以滾動的界面的大小,從而保證即使軟鍵盤顯示出來了,也能夠看到所有的內(nèi)容。如果布局里面沒有滾動的控件,那么軟鍵盤可能就會蓋住一些內(nèi)容

沒有滾動可輸入在上方
沒有滾動有輸入在下方

如果沒有滾動控件,當(dāng)可輸入的控件在上面時,軟件盤會遮擋內(nèi)容;當(dāng)可輸入的控件在下面時,內(nèi)容被頂上去了,同時標(biāo)題欄也被頂上去了

有滾動可輸入在上方
有滾動可輸入在下方

如果有滾動控件,當(dāng)可輸入的控件在上面時,系統(tǒng)會減小可以滾動的界面的大小,從而保證即使軟鍵盤顯示出來了同時內(nèi)容可以滾動顯示出來;當(dāng)可輸入的控件在下面時,內(nèi)容被頂上去了,但是標(biāo)題欄沒有被頂上去。

2.adjustResize

這個屬性表示Activity的主窗口總是會被調(diào)整大小,從而保證軟鍵盤顯示空間。它跟adjustUnspecified的區(qū)別就在于當(dāng)頁面可滾動并且可輸入控件在下面的時候,內(nèi)容被頂上去了,但是標(biāo)題欄沒有被頂上去。

可滾動有輸入在下方

3.adjustPan

Activity的屏幕大小并不會調(diào)整來保證軟鍵盤的空間,而是采取了另外一種策略,系統(tǒng)會通過布局的移動,來保證用戶要進行輸入的輸入框肯定在用戶的視線范圍內(nèi),從而讓用戶可以看到自己輸入的內(nèi)容。對于沒有滾動控件的布局來說,這個其實就是默認的設(shè)置,如果我們選擇的位置偏下,上面的標(biāo)題欄和部分控件會被頂上去。但是對于有滾動控件的布局來說,則不太一樣,我們看下面的效果圖。

不能滾動在上面
能滾動在上面

只要可輸入控件在上面,不管能否滾動,軟件盤都會遮擋部分內(nèi)容的

不能滾動在下面
能滾動在下面

只要可輸入控件在下面,不管能否滾動,內(nèi)容和標(biāo)題欄都會被頂上去的。

第三部分:關(guān)于使用

上面第一部分介紹了軟件盤的顯示與隱藏,第二部分介紹了軟件盤與內(nèi)容之間的顯示關(guān)系,一般我們在使用的時候都是結(jié)合二者使用的。

android:windowSoftInputMode="【A】|【B】"http://A:為顯示屬性 B:為關(guān)系屬性
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明AI閱讀 16,205評論 3 119
  • 菜譜涼拌洋蔥木耳調(diào)料:蠔油、香油、食鹽、白糖、食醋、醬油(可以選擇性的放點小米椒)做法:將洋蔥切成絲(按自己的要求...
    炫藏DJDZ閱讀 186評論 0 0
  • 快速完成一個新聞APP 本Demo主要使用的技術(shù): 看標(biāo)題就知道了 Material Design 聚合數(shù)據(jù) 效果...
    PageNoFound閱讀 692評論 1 7
  • 什么是 CSS hack 由于不同廠商的瀏覽器,比如Internet Explorer,Safari,Mozill...
    月光下的微笑閱讀 168評論 0 0

友情鏈接更多精彩內(nèi)容