Android 提供了 windowSoftInputMode 屬性來(lái)控制輸入法軟鍵盤(pán)窗口和 Activity 主窗口的交互,分為 窗口尺寸調(diào)整系列 和 輸入法軟鍵盤(pán)顯示控制系列。
窗口尺寸調(diào)整系列:
該系列參數(shù)用來(lái)控制當(dāng)軟鍵盤(pán)彈起時(shí),Activity 主窗口的調(diào)整策略,因?yàn)槿绻徽{(diào)整主窗口,很可能會(huì)導(dǎo)致當(dāng)前輸入的控件被軟鍵盤(pán)遮擋。
adjustPan:
Activity的主窗口并不會(huì)重新調(diào)整大小來(lái)為輸入法騰出空間,而是窗口的內(nèi)容會(huì)自動(dòng)上下晃動(dòng)來(lái)保證當(dāng)前獲得焦點(diǎn)的控件不會(huì)被鍵盤(pán)遮擋住,然后用戶(hù)可以看見(jiàn)自己輸入的內(nèi)容。相比于 adjustResize 模式而言,它并不是很令人滿(mǎn)意,因?yàn)橛脩?hù)必須關(guān)閉輸入法來(lái)和被輸入法遮擋住的控件進(jìn)行交互。
adjustResize:
Activity的主窗口會(huì)重新調(diào)整大小來(lái)為輸入法騰出空間。
adjustUnspecified:
當(dāng)前模式并不會(huì)明確指定 Activity 使用adjustPan 或者 adjustResize ,系統(tǒng)會(huì)自動(dòng)選擇一個(gè)模式,選擇結(jié)果是,如果當(dāng)前 Activity 的 Window 中,有可以滾動(dòng)自身內(nèi)容的控件,比如 ScrollView,那么選擇結(jié)果就是 adjustResize,因?yàn)樗J(rèn)為滾動(dòng)可以使 Window 中的內(nèi)容即使在一個(gè)很小的區(qū)域中也可以被看見(jiàn)。Activity 的默認(rèn)模式就是這個(gè)模式。
adjustNoting:
Activity 的 Window 沒(méi)有任何變化。
兩種模式下,屏幕 - 主窗口 - 主窗口內(nèi)容 - 軟鍵盤(pán) 的關(guān)系如下:
具體效果如下:
沒(méi)有滾動(dòng)內(nèi)容,adjustPan:
沒(méi)有滾動(dòng)內(nèi)容,adjustResize:
沒(méi)有滾動(dòng)內(nèi)容,adjustUnspecified == adjustPan
有滾動(dòng)內(nèi)容(ScrollView),adjustPan
有滾動(dòng)內(nèi)容(ScrollView),adjustResize
有滾動(dòng)內(nèi)容(ScrollView),adjustUnspecified == adjustResize
輸入法軟鍵盤(pán)顯示控制系列:
該系列參數(shù)用來(lái)控制當(dāng)一個(gè)包含 Window 的事物(Activity、Dialog等)展示在屏幕最前端時(shí),軟鍵盤(pán)的顯示或者隱藏策略。
stateUnspecified:
系統(tǒng)根據(jù)當(dāng)前具體情況,選擇相應(yīng)的模式。
stateUnchanged:
軟鍵盤(pán)保持它的上一個(gè)狀態(tài)(上一個(gè)Activity 或者 Dialog 在屏幕最前端時(shí),軟鍵盤(pán)的狀態(tài)),不做變化,不管上一個(gè)狀態(tài)是顯示還是隱藏。
stateHidden:
當(dāng)用戶(hù)主動(dòng)進(jìn)入當(dāng)前界面時(shí),軟鍵盤(pán)隱藏。離開(kāi)上一個(gè) 界面,返回當(dāng)前界面,不能算作 “主動(dòng)進(jìn)入”。被動(dòng)進(jìn)入時(shí),保持上一個(gè)狀態(tài)。
stateAlwaysHidden:
只要是用戶(hù)進(jìn)入該界面,就隱藏軟鍵盤(pán),不管是主動(dòng)進(jìn)入(新啟動(dòng)該界面),還是被動(dòng)進(jìn)入(離開(kāi)上一個(gè)界面,返回到當(dāng)前界面)。
stateVisible:
當(dāng)用戶(hù)主動(dòng)進(jìn)入當(dāng)前界面時(shí),顯示軟鍵盤(pán)。離開(kāi)上一個(gè) 界面,返回當(dāng)前界面,不能算作 “主動(dòng)進(jìn)入”。被動(dòng)進(jìn)入時(shí),保持上一個(gè)狀態(tài)。
stateAlwaysVisible:
只要是用戶(hù)進(jìn)入該界面,就顯示軟鍵盤(pán),不管是主動(dòng)進(jìn)入(新啟動(dòng)該界面),還是被動(dòng)進(jìn)入(離開(kāi)上一個(gè)界面,返回到當(dāng)前界面)。
關(guān)于某些華為手機(jī)的一個(gè)Bug
今天遇到一個(gè)Bug,是這樣的,在某些華為手機(jī)上面,除了第一次點(diǎn)擊輸入框,adjustPan 參數(shù)會(huì)生效(軟鍵盤(pán)可以正常彈起輸入框),后面從第二次開(kāi)始,怎么點(diǎn)擊,adjustPan 參數(shù)都無(wú)效。
布局模型大致如下:
[html] view plain copy print?
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="cn.hjf.inputtest.MainActivity">
<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">
<View
android:layout_width="match_parent"
android:layout_height="400dp"
android:background="#2b532b"/>
<EditText
android:layout_width="90dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:background="@null"
android:gravity="center"
android:inputType="numberDecimal"
android:maxLength="8"
android:minWidth="60dp"
android:padding="5dp"
android:text="0.00"/>
</LinearLayout>
</ScrollView>
</RelativeLayout>
<RelativeLayout
效果是這樣的:
經(jīng)過(guò)漫長(zhǎng)時(shí)間的排除(很辛苦),終于找到了Bug的觸發(fā)臨界點(diǎn),就是下面這兩句話(huà):
[html] view plain copy print?
android:gravity="center"
android:inputType="numberDecimal"
android:gravity="center"
又經(jīng)過(guò)了漫長(zhǎng)時(shí)間的驗(yàn)證,得出一個(gè)結(jié)論:在某些華為機(jī)型上面,在這種布局模型下,EditText 中如果設(shè)置了 inputType 參數(shù)(不為 none),那么,在 gravity 取值為某些值得時(shí)候,會(huì)導(dǎo)致該問(wèn)題的發(fā)生。大致情況如下:
紅色表示失效,綠色表示有效(可以正常工作)。當(dāng)這兩個(gè)參數(shù)不指定的時(shí)候,可以工作,因?yàn)檫@兩個(gè)屬性默認(rèn)值的組合是可以工作的,上圖中的藍(lán)色塊。(備注:沒(méi)有完全匹配所有情況,如有相似情況,可以按需匹配,查看結(jié)果)
在源碼中可以找到這兩個(gè)屬性的默認(rèn)值:
attrs.xml
[html] view plain copy print?
<!-- Default EditText style. -->
<attr name="editTextStyle" format="reference" />
<!-- Default EditText style. -->
themes.xml
[html] view plain copy print?
<item name="editTextStyle">@style/Widget.EditText</item>
<item name="editTextStyle">@style/Widget.EditText</item>
styles.xml
[html] view plain copy print?
<style name="Widget.EditText">
<item name="focusable">true</item>
<item name="focusableInTouchMode">true</item>
<item name="clickable">true</item>
<item name="background">?attr/editTextBackground</item>
<item name="textAppearance">?attr/textAppearanceMediumInverse</item>
<item name="textColor">?attr/editTextColor</item>
<item name="gravity">center_vertical</item>
<item name="breakStrategy">simple</item>
<item name="hyphenationFrequency">normal</item>
</style>
<style name="Widget.EditText">
attrs.xml
[html] view plain copy print?
<!-- The type of data being placed in a text field, used to help an
input method decide how to let the user enter text. The constants
here correspond to those defined by
{@link android.text.InputType}. Generally you can select
a single value, though some can be combined together as
indicated. Setting this attribute to anything besides
<var>none</var> also implies that the text is editable. -->
<attr name="inputType">
<!-- There is no content type. The text is not editable. -->
<flag name="none" value="0x00000000" />
..........
<!-- The type of data being placed in a text field, used to help an
[java] view plain copy print?
/**
* Special content type for when no explicit type has been specified.
* This should be interpreted to mean that the target input connection
* is not rich, it can not process and show things like candidate text nor
* retrieve the current text, so the input method will need to run in a
* limited "generate key events" mode, if it supports it. Note that some
* input methods may not support it, for example a voice-based input
* method will likely not be able to generate key events even if this
* flag is set.
*/
public static final int TYPE_NULL = 0x00000000;
/**
一個(gè)需求
遇到一個(gè)需求,大致模型為:有一個(gè)界面,里面有一個(gè) 輸入框 和 兩個(gè)按鈕,分別控制輸入框中數(shù)字的加減,如下圖所示:
每次輸入框數(shù)字變化,不管是手動(dòng)輸入還是按鈕控制,都會(huì)出發(fā)刷新工作,刷新時(shí)會(huì)彈出一個(gè)對(duì)話(huà)框。
然后需求是這樣的,當(dāng)手動(dòng)輸入的時(shí)候,這時(shí)觸發(fā)刷新時(shí),輸入法是顯示的,但是對(duì)話(huà)框顯示然后消失后,輸入法就被隱藏了。當(dāng)用按鈕控制的時(shí)候,是沒(méi)問(wèn)題的,因?yàn)檎麄€(gè)過(guò)程,輸入法都是隱藏的。所以需求就是,在對(duì)話(huà)框顯示然后消失后,輸入法能保持出發(fā)刷新時(shí)的狀態(tài)。
解決問(wèn)題:當(dāng)把當(dāng)前 Activity 設(shè)置為 stateUnchanged 的時(shí)候,并沒(méi)有達(dá)到理想的效果,因?yàn)閐ialog所在的window,沒(méi)有設(shè)置該屬性,所以需要把dialog的window也設(shè)置為stateUnchanged,方法為:
[java] view plain copy print?
getWindow().setSoftInputMode()
天這篇文章我們主要來(lái)看一下表單的控件都有哪些,如何使用表單標(biāo)簽,與用戶(hù)交互。
(1)網(wǎng)站怎樣與用戶(hù)進(jìn)行交互?
答案是使用HTML表單(form)。表單是可以把瀏覽者輸入的數(shù)據(jù)傳送到服務(wù)器端,這樣服務(wù)器端程序就可以處理表單傳過(guò)來(lái)的數(shù)據(jù)。
使用語(yǔ)法:<form method="傳送方式" action="服務(wù)器文件"></form>
詳細(xì)講解:
1、<form> :<form>標(biāo)簽是成對(duì)出現(xiàn)的,以<form>開(kāi)始,以</form>結(jié)束。
2、action :瀏覽者輸入的數(shù)據(jù)被傳送到的地方,比如一個(gè)PHP頁(yè)面(save.php),后臺(tái)可以通過(guò)這個(gè)文件來(lái)接收前端傳過(guò)去的數(shù)據(jù)資料并進(jìn)行分析處理。
3、method : 數(shù)據(jù)傳送的方式(get/post),get多用于獲取數(shù)據(jù),post多用于提交數(shù)據(jù)(關(guān)于這一塊大家可以簡(jiǎn)單了解一下即可,后期我們會(huì)在網(wǎng)站制作的時(shí)候進(jìn)行講解)。
注意:所有表單控件(文本框、文本域、按鈕、單選框、復(fù)選框等)都必須放在 <form></form> 標(biāo)簽之間(否則用戶(hù)輸入的信息可提交不到服務(wù)器上哦!)。
(2)表單控件介紹
1)文本輸入框、密碼輸入框
當(dāng)用戶(hù)要在表單中鍵入字母、數(shù)字等內(nèi)容時(shí),就會(huì)用到文本輸入框。文本框和密碼框只有type類(lèi)型的區(qū)別,其它的寫(xiě)法是一樣的。
使用語(yǔ)法:
文本輸入框:<input type="text" name="文本名稱(chēng)" value="文本內(nèi)容" placeholder="文本提示信息" />
密碼輸入框:<input type="password" name="密碼名稱(chēng)" value="密碼信息" placeholder="密碼提示信息" />
詳細(xì)講解:
1、type:當(dāng)type="text"時(shí),輸入框?yàn)槲谋据斎肟颍斎氲奈淖质强梢钥匆?jiàn)的;當(dāng)type="password"時(shí), 輸入框?yàn)槊艽a輸入框,輸入的文字內(nèi)容是無(wú)法看見(jiàn)的。
2、name:為文本框/密碼框命名,以備后臺(tái)程序使用。
3、value:為文本輸入框輸入的內(nèi)容。
4、placeholder:當(dāng)我們的value內(nèi)容為空的時(shí)候顯示,用于提示輸入框輸入信息格式;
使用練習(xí):我們創(chuàng)建一個(gè)表單,表單里邊包含用戶(hù)名和密碼輸入框。具體的代碼如下圖所示:
在網(wǎng)頁(yè)中的顯示效果如下所示:
2)多行文本輸入框
上邊文本輸入框用于輸入單行的文本內(nèi)容,當(dāng)用戶(hù)需要在表單中輸入大段文字時(shí),需要用到文本輸入域。
使用語(yǔ)法:<textarea rows="行數(shù)" cols="列數(shù)" placeholder="多行文本提示信息" >文本</textarea>
詳細(xì)講解:
1、<textarea>標(biāo)簽是成對(duì)出現(xiàn)的,以<textarea>開(kāi)始,以</textarea>結(jié)束。
2、cols:用于控制多行輸入域的列數(shù),rows :用于控制多行輸入域的行數(shù)。
3、placeholder:當(dāng)我們的textarea內(nèi)容為空的時(shí)候顯示,用于提示輸入框輸入信息格式;
使用練習(xí):我們創(chuàng)建一個(gè)新的表單,表單里邊包含用戶(hù)名和密碼輸入框和用戶(hù)個(gè)人簡(jiǎn)介多行輸入框。具體的代碼如下圖所示:
我們?cè)倬W(wǎng)頁(yè)中的顯示效果就如下圖所示:
好了,本篇文章就先給大家介紹這兩個(gè)表單控件的語(yǔ)法以及使用,下篇文章我們將介紹下拉框、選擇框、多選框的語(yǔ)法及使用,記得要多加練習(xí)才是王道。
每日金句:把每一件簡(jiǎn)單的事做好就是不簡(jiǎn)單;把每一件平凡的事做好就是不平凡。喜歡我的文章的小伙伴記得關(guān)注一下哦,每天將為你更新最新知識(shí)。
:想了解input和label請(qǐng)參看我寫(xiě)的文【207】點(diǎn)我進(jìn)入【207】
一、button。
<button>是按鈕標(biāo)簽,<input type="button" />也是按鈕標(biāo)簽,它們之間的區(qū)別就是button更加強(qiáng)大,它除了可以包含文本之外,還可以包含格式化的文本和圖像,這就是它的強(qiáng)大所在,下面展示它的圖片按鈕功能,當(dāng)然我畫(huà)的按鈕很丑,別介意。
圖1
圖2
這里隨便講講button標(biāo)簽的四個(gè)常用屬性。
圖3
圖4
圖5
二、select。
select是列表和下拉菜單,select不能一個(gè)人戰(zhàn)斗,它需要option的配合。
圖6
圖7
disable是禁用的意思。
圖8
圖9
optgroup可以對(duì)option進(jìn)行分組。
圖10
圖11
selected初始被選中的項(xiàng),開(kāi)始時(shí)默認(rèn)選中菠蘿。
圖12
圖13
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。