EditText屬性及一些常用用法
繼承關係:
class EditText extends TextView
android:inputType
在開發的過程中,通常會用到EditText,如何讓虛擬鍵盤來適應輸入框中內容的型別,通常我們都會在xml檔案中加入android:inputType=”“。
android:inputType="none"
android:inputType="text"
android:inputType="textCapCharacters"//前3個輸入普通字元
android:inputType="textCapWords"//單詞首字母大小
android:inputType="textCapSentences" //僅第一個字母大小
android:inputType="textAutoCorrect"android:inputType="textAutoComplete"//前兩個自動完成
android:inputType="textMultiLine"//多行輸入
android:inputType="textImeMultiLine"//輸入法多行(不一定支援)
android:inputType="textNoSuggestions"//不提示
android:inputType="textUri"//URI格式
android:inputType="textEmailAddress"//電子郵件地址格式
android: inputType="textEmailSubject"//郵件主題格式
android:inputType="textShortMessage"//短訊息格式
android:inputType="textLongMessage"android:inputType="textPersonName"//人名格式
android:inputType="textPostalAddress"//郵政格式
android:inputType="textPassword"//密碼格式
android:inputType="textVisiblePassword"//密碼可見格式
android:inputType="textWebEditText" //作為網頁表單的文字格式
android:inputType="textFilter"//文字篩選格式
android:inputType="textPhonetic"//拼音輸入格式
android:inputType="number"//數字格式
android:inputType="numberSigned"//有符號數字格式
android:inputType="numberDecimal"//可以帶小數點的浮點格式
android:inputType="phone"//撥號鍵盤
android:inputType="datetime"android:inputType="date"//日期鍵盤
android:inputType="time"//時間鍵盤
EditText是否自動彈出輸入法鍵盤
在開發過程中,我們經常會遇到Activity中包含EditText控制元件時會自動彈出虛擬鍵盤的情況,這是由於EditText自動獲得焦點的緣故,只要讓EditText失去焦點就行了,解決辦法如下:
1、在Manifest.xml檔案中相應的Activity下新增如下程式碼:
android:windowSoftInputMode="stateHidden"
2、讓EditText失去焦點,用EditText的clearFocus:
EditText edt = (EditText)findViewById(R.id.edt);
edt.clearFocus();
3、強制隱藏Android輸入法視窗:
EditText edt = (EditText)findViewById(R.id.edt);
InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(edt.getWindowToken(), 0);
4、要求EditText始終不彈出虛擬鍵盤:
EditText edt = (EditText)findViewById(R.id.edt);
edt.setInputType(InputType.TYPE_NULL);
但有時我們確實是想讓EditText自動獲得焦點並彈出軟鍵盤,在設定了EditText自動獲得焦點後,軟體盤不會彈出。
注意:此時是由於剛跳到一個新的介面,介面未載入完全而無法彈出軟鍵盤。此時應該適當的延遲彈出軟鍵盤,如500毫秒(保證介面的資料載入完成,如果500毫秒仍未彈出,則延長至1000毫秒)。
1、可以在EditText後面加上一段程式碼:
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
InputMethodManager inputManager = (InputMethodManager) editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.showSoftInput(editText, 0);
}
}, 500);
2、給activity配置加入屬性:
android:windowSoftInputMode="adjustResize"
在EditText中軟鍵盤的調起、關閉
(1)EditText有焦點(focusable為true)阻止輸入法彈出
editText=(EditText)findViewById(R.id.txtBody);
editText.setOnTouchListener(new OnTouchListener(){
public boolean onTouch(View v, MotionEvent event){
editText.setInputType(InputType.TYPE_NULL); //關閉軟鍵盤
return false;
}
});
(2)當EidtText無焦點(focusable=false)時阻止輸入法彈出
InputMethodManager imm =
(InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(),0);
(3)呼叫數字鍵盤並設定輸入型別和鍵盤為英文
etNumber.setInputType(InputType.TYPE_CLASS_NUMBER); //呼叫數字鍵盤
rlEditText.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE);
//設定輸入型別和鍵盤為英文
android:inputType="textUri|textMultiLine"
(4)
android:focusable="false"//鍵盤永遠不會彈出
<activity
android:name=".AddLinkman"
android:windowSoftInputMode="adjustUnspecified|stateHidden"/>//不自動彈出鍵盤
//關閉鍵盤(比如輸入結束後執行)
InputMethodManager imm =(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(etEditText.getWindowToken(), 0);
//自動彈出鍵盤
((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).toggleSoftInput(0,InputMethodManager.HIDE_NOT_ALWAYS);
etEditText.requestFocus();//讓EditText獲得焦點,但是獲得焦點並不會自動彈出鍵盤
有時候也要對intent的預設焦點進行設定,不至於在intent跳轉的時候預設焦點(游標)在EditText上,導致進入intent就開啟輸入法,影響介面美觀。
預設焦點的順序是:從上到下、從左到右第一個可以輸入的控制元件作為焦點。
可以讓別的控制元件獲取焦點:
button.setFocusable(true);
button.requestFocus();
button.setFocusableInTouchMode(true);
也可以:
在EditText前面放置一個看不到的或Editview的父佈局LinearLayout,讓他率先獲取焦點:
<LinearLayout
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="0px"
android:layout_height="0px"/>
EditText密碼顯示隱藏
XML檔案中:
Android:password="true" // 以”.”形式顯示密碼文字
android:inputType=”textPassword” //不可見密碼
android:inputType=”textVisiblePassword”//可見密碼
Java程式碼中
et.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
et.setTransformationMethod(PasswordTransformationMethod.getInstance());
例子如下:
//密碼是否隱藏
imgviewForgetPwEye.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v) {
if (isshow) {
//設定密碼為隱藏的
editForgetPwUserPasswd.setTransformationMethod(PasswordTransformationMethod.getInstance());
isshow = false;
} else {
//設定EditText的密碼為可見的
editForgetPwUserPasswd.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
isshow = true;
}
}
});
EditText的屬性很多,這裡介紹一些:
android:hint="請輸入數字!"//設定顯示在空間上的提示資訊
android:numeric="integer"//設定只能輸入整數,如果是小數則是:decimal
android:singleLine="true"//設定單行輸入,一旦設定為true,則文字不會自動換行。
android:password="true"//設定只能輸入密碼
android:textColor = "#ff8c00"//字型顏色
android:textStyle="bold"//字型,bold, italic, bolditalic
android:textSize="20dip"//大小
android:capitalize="characters"//以大寫字母寫,設定英文字母大寫型別。設定如下值:sentences僅第一個字母大寫;words每一個單詞首字母大小,用空格區分單詞;characters每一個英文字母都大寫。
android:textAlign="center"//EditText沒有這個屬性,但TextView有,居中
android:textColorHighlight="#cccccc"//被選中文字的底色,預設為藍色
android:textColorHint="#ffff00"//設定提示資訊文字的顏色,預設為灰色
android:textScaleX="1.5"//控制字與字之間的間距
android:typeface="monospace"//字型,normal, sans, serif, monospace
android:background="@null"//背景,這裡沒有,指透明
android:layout_weight="1"//權重,控制控制元件之間的地位,在控制控制元件顯示的大小時蠻有用的。
android:textAppearance="?android:attr/textAppearanceLargeInverse"//文字外觀,這裡引用的是系統自帶的一個外觀,?表示系統是否有這種外觀,否則使用預設的外觀。
android:layout_gravity="center_vertical"//設定控制元件顯示的位置:預設top,這裡居中顯示,還有bottom
android:gray="top"//多行中指標在第一行第一位置
et.setSelection(et.length());//調整游標到最後一行
android:autoText //自動拼寫幫助
android:digits //設定只接受某些數字
android:phoneNumber //輸入電話號碼
android:editable //是否可編輯
android:autoLink=”all” //設定文字超連結樣式當點選網址時,跳向該網址
android:cursorVisible="false" //隱藏游標
android:background="#00000000"//不要文字框背景
android:textAppearance="?android:attr/textAppearanceLargeInverse"//文字外觀,這裡引用的是系統自帶的一個外觀,?表示系統是否有這種外觀,否則使用預設的外觀。不知道這樣理解對不對?
屬性名稱描述
android:autoLink//設定是否當文字為URL連結/email/電話號碼/map時,文字顯示為可點選的連結。可選值(none/web/email/phone/map/all)
android:autoText//如果設定,將自動執行輸入值的拼寫糾正。此處無效果,在顯示輸入法並輸入的時候起作用。
android:bufferType//指定getText()方式取得的文字類別。選項editable 類似於StringBuilder可追加字元,也就是說getText後可呼叫append方法設定文字內容。spannable 則可在給定的字元區域使用樣式,參見這裡1、這裡2。
android:capitalize//設定英文字母大寫型別。此處無效果,需要彈出輸入法才能看得到,參見EditView此屬性說明。
android:cursorVisible//設定游標為顯示/隱藏,預設顯示。
android:digits//設定允許輸入哪些字元。如“1234567890.+-*/% ()”
android:drawableBottom//在text的下方輸出一個drawable,如圖片。如果指定一個顏色的話會把text的背景設為該顏色,並且同時和background使用時覆蓋後者。
android:drawableLeft//在text的左邊輸出一個drawable,如圖片。
android:drawablePadding//設定text與drawable(圖片)的間隔,與drawableLeft、drawableRight、drawableTop、drawableBottom一起使用,可設定為負數,單獨使用沒有效果。
android:drawableRight//在text的右邊輸出一個drawable,如圖片。
android:drawableTop//在text的正上方輸出一個drawable,如圖片。
android:editable//設定是否可編輯。這裡無效果,參見EditView。
android:editorExtras//設定文字的額外的輸入資料。在EditView再討論。
android:ellipsize//設定當文字過長時,該控制元件該如何顯示。有如下值設定:”start”—?省略號顯示在開頭;”end”——省略號顯示在結尾;”middle”—-省略號顯示在中間;”marquee” ——以跑馬燈的方式顯示(動畫橫向移動)
android:freezesText//設定儲存文字的內容以及游標的位置。參見:這裡。
android:gravity//設定文字位置,如設定成“center”,文字將居中顯示。
android:hintText//為空時顯示的文字提示資訊,可通過textColorHint設定提示資訊的顏色。此屬性在EditView中使用,但是這裡也可以用。
android:imeOptions//附加功能,設定右下角IME動作與編輯框相關的動作,如actionDone右下角將顯示一個“完成”,而不設定預設是一個回車符號。這個在EditView中再詳細說明,此處無用。
android:imeActionId//設定IME動作ID。在EditView再做說明,可以先看這篇帖子:這裡。
android:imeActionLabel//設定IME動作標籤。在EditView再做說明。
android:includeFontPadding//設定文字是否包含頂部和底部額外空白,預設為true。
android:inputMethod//為文字指定輸入法,需要完全限定名(完整的包名)。例如:com.google.android.inputmethod.pinyin,但是這裡報錯找不到。
android:inputType//設定文字的型別,用於幫助輸入法顯示合適的鍵盤型別。在EditView中再詳細說明,這裡無效果。
android:linksClickable//設定連結是否點選連線,即使設定了autoLink。
android:marqueeRepeatLimit//在ellipsize指定marquee的情況下,設定重複滾動的次數,當設定為marquee_forever時表示無限次。
android:ems//設定TextView的寬度為N個字元的寬度。這裡測試為一個漢字字元寬度,如圖:
android:maxEms//設定TextView的寬度為最長為N個字元的寬度。與ems同時使用時覆蓋ems選項。
android:minEms//設定TextView的寬度為最短為N個字元的寬度。與ems同時使用時覆蓋ems選項。
android:maxLength//限制顯示的文字長度,超出部分不顯示。
android:lines//設定文字的行數,設定兩行就顯示兩行,即使第二行沒有資料。
android:maxLines//設定文字的最大顯示行數,與width或者layout_width結合使用,超出部分自動換行,超出行數將不顯示。
android:minLines//設定文字的最小行數,與lines類似。
android:lineSpacing//Extra設定行間距。
android:lineSpacingMultiplier//設定行間距的倍數。如”1.2”
android:numeric//如果被設定,該TextView有一個數字輸入法。此處無用,設定後唯一效果是TextView有點選效果,此屬性在EdtiView將詳細說明。
android:password//以小點”.”顯示文字
android:phoneNumber//設定為電話號碼的輸入方式。
android:privateImeOptions//設定輸入法選項,此處無用,在EditText將進一步討論。
android:scrollHorizontally//設定文字超出TextView的寬度的情況下,是否出現橫拉條。
android:selectAllOnFocus//如果文字是可選擇的,讓他獲取焦點而不是將游標移動為文字的開始位置或者末尾位置。TextView中設定後無效果。
android:shadowColor//指定文字陰影的顏色,需要與shadowRadius一起使用。效果:
android:shadowDx//設定陰影橫向座標開始位置。
android:shadowDy//設定陰影縱向座標開始位置。
android:shadowRadius//設定陰影的半徑。設定為0.1就變成字型的顏色了,一般設定為3.0的效果比較好。
android:singleLine//設定單行顯示。如果和layout_width一起使用,當文字不能全部顯示時,後面用“…”來表示。如android:text="test_ singleLine " android:singleLine="true" android:layout_width="20dp"將只顯示“t…”。如果不設定singleLine或者設定為false,文字將自動換行
android:textStyle//設定字形[bold(粗體) 0, italic(斜體) 1, bolditalic(又粗又斜) 2] 可以設定一個或多個,用“|”隔開
android:typeface//設定文字字型,必須是以下常量值之一:normal 0, sans 1, serif 2, monospace(等寬字型) 3]
android:maxHeight//設定文字區域的最大高度
android:minHeight//設定文字區域的最小高度
android:maxWidth//設定文字區域的最大寬度
android:minWidth//設定文字區域的最小寬度
android:textAppearance//設定文字外觀。如“?android:attr/textAppearanceLargeInverse
”這裡引用的是系統自帶的一個外觀,?表示系統是否有這種外觀,否則使用預設的外觀。可設定的值如下:textAppearanceButton/textAppearanceInverse/textAppearanceLarge/textAppearanceLargeInverse/textAppearanceMedium/textAppearanceMediumInverse/textAppearanceSmall/textAppearanceSmallInverse
android:textAppearance設定文字外觀。如“?android:attr/textAppearanceLargeInverse
”這裡引用的是系統自帶的一個外觀,?表示系統是否有這種外觀,否則使用預設的外觀。可設定的值如下:textAppearanceButton/textAppearanceInverse/textAppearanceLarge/textAppearanceLargeInverse/textAppearanceMedium/textAppearanceMediumInverse
監聽EditText的變化
使用EditText的addTextChangedListener(TextWatcher watcher)方法對EditText實現監聽,TextWatcher是一個介面類,所以必須實現TextWatcher裡的抽象方法:
例子一:
text.addTextChangedListener(textWatcher);
private TextWatcher textWatcher = new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
Log.d("TAG","afterTextChanged--------------->");
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
Log.d("TAG","beforeTextChanged--------------->");
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
Log.d("TAG","onTextChanged--------------->");
str = text.getText().toString();
try {
//if ((heighText.getText().toString())!=null)
Integer.parseInt(str);
} catch (Exception e) {
// TODO: handle exception
showDialog();
}
}
};
private void showDialog(){
AlertDialog dialog;
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("訊息").setIcon(android.R.drawable.stat_notify_error);
builder.setMessage("你輸出的整型數字有誤,請改正");
builder.setPositiveButton("確定", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
});
dialog = builder.create();
dialog.show();
}
例子二:
et.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
tv.setText("還能輸入"+Rest_Length+"個字");
}
@Override
public void afterTextChanged(Editable s) {
tv.setText("還能輸入"+Rest_Length+"個字");
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(Rest_Length>0){
Rest_Length = MAX_LENGTH - et.getText().length();
}
}
});
clearBtn.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
et.setText("");
Rest_Length = MAX_LENGTH;
}
});
}
關於焦點:
et.setFocusable(true);
et.setFocusableInTouchMode(true);
et.requestFocus();
et.clearFocus();//失去焦點
et.requestFocus();//獲取焦點
EditText彈出軟鍵盤遮住輸入框問題
如果在Activity中的佈局的下方有EditText,獲取焦點彈出軟鍵盤的時候,如果不做處理,軟鍵盤可能會遮擋輸入框,使用者提現不好,網上也有很多人提出結局方案,這裡就分析一下解決的效果.
需要用到EditText的佈局大概分為兩種,一種是頁面顯示的內容不希望有殘缺,比如軟鍵盤把標題擠出了螢幕,如登入註冊搜尋等,EditText多半在頁面上半部分.另一種是頁面的上半部分不重要,比如聊天視窗,軟鍵盤彈出的時候,上半部分的聊天記錄可以被基礎螢幕外,EditText多半在最下方.其他的情況可以根據本文做出選擇,結果在最下面.
開始:
網上針對這個問題解決的方法大概這麼幾種:
1.修改AndroidManifest.xml檔案
2.在Activity中新增配置
3.在佈局檔案中新增ScrollView
1.修改AndroidManifest.xml檔案
在AndroidManifest.xml中對應的Activity配置:android:windowSoftInputMode=”stateVisible|adjustResize”
<activity
android:name=".LoginActivity"
//顯示軟鍵盤,並讓佈局壓縮 android:windowSoftInputMode="stateVisible|adjustResize"
android:screenOrientation="portrait">
</activity>
含義:該頁面在彈出軟鍵盤的同時螢幕內容被壓縮,以騰出軟鍵盤的空間.
解釋它們的含義:
stateUnspecified
//:介面沒有設定"android:windowSoftInputMode"時的狀態.這個狀態是彈出有EditText的介面時時不彈出軟鍵盤的,當EditText獲取焦點的時候彈出軟體盤
stateUnchanged
//:狀態不改變,意思就是和上一個介面相同,上一個介面彈出軟鍵盤,跳轉到這個介面時,軟鍵盤也是彈出狀態.
stateHidden
//:隱藏鍵盤,彈出這個介面的時候,不管上個介面是什麼狀態,這個介面的軟鍵盤都是隱藏的.
stateAlwaysHidden
//:一直隱藏(跟上面的區別未知,試不出來).
stateVisible
//:強制彈出軟鍵盤.跳轉到介面後,沒有EditText也彈出鍵盤.
stateAlwaysVisible
//:一直顯示鍵盤(同上).
這裡開始就是跟內容相關的了,也跟本文也相關
adjustUnspecified
//:算是預設方式.如果介面沒有被ScrowView包裹,鍵盤會擋住一部分內容,如果介面被ScrowView包裹了,會讓ScrowView中的內容滾動,以放下軟鍵盤.
adjustResize
//:主介面會縮放,用來放置軟鍵盤.
adjustPan
//:主介面不會縮放,會向上移來放置軟鍵盤
上面兩個不同的地方在於,如果內容是listview,當顯示最下面一個item後彈出軟鍵盤,adjustResize會讓listview下沿被軟鍵盤擋住,adjustPan則還是顯示最下面一個item.
2.在Activity中新增配置
在該Activity中的onCretae()的setContentView()方法前面新增:getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN)
含義:把整個Layout頂上去露出獲得焦點的EditText,不壓縮多餘空間.
解釋他們的含義:
SOFT_INPUT_ADJUST_NOTHING
//: 不調整(輸入法完全直接覆蓋住,未開放此引數);
SOFT_INPUT_ADJUST_PAN
//:把整個Layout頂上去露出獲得焦點的EditText,不壓縮多餘空間
SOFT_INPUT_ADJUST_RESIZE
//: 整個Layout重新編排,重新分配多餘空間;
SOFT_INPUT_ADJUST_UNSPECIFIED
//: 系統自己根據內容自行選擇上兩種方式的一種執行(預設配置).
這裡SOFT_INPUT_ADJUST_RESIZE和SOFT_INPUT_ADJUST_PAN和上面中的adjustResize和adjustPan效果是一樣的.
@Overrideprotected
void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//讓佈局向上移來顯示軟鍵盤
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
setContentView(R.layout.activity_login);
init();
}
3.在佈局檔案中新增ScrollView
ScrollView是能讓彈出的軟鍵盤新增到佈局的下面,從而不擋住部分佈局.這裡往往需要跟上面的adjustResize和adjustPan兩個狀態一起用.
佈局:
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="8"
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<EditText
android:layout_width="match_parent"
android:layout_height="50dp" />
</LinearLayout>
</ScrollView>
向上移的方式 設定:
<activity
android:name=".SecondActivity"
android:windowSoftInputMode="adjustPan">
</activity>
壓縮的方式 設定:
<activity
android:name=".SecondActivity"
android:windowSoftInputMode="adjustResize"></activity>
結果:
只要彈出軟鍵盤會影響到佈局的情況,都用ScrollView把佈局包裹起來,被包裹的內容就是可能被縮放或擠出螢幕外的內容.然後根據EditText的位置判斷用adjustResize還是用adjustPan.
adjustResize是收縮,adjustPan是向上擠
個人推薦,登入註冊用adjustResize,聊天視窗用adjustPan
參考:
限制只能輸入指定的字元
andorid editext android:digits=”abcdefghijklmnopqrstuvwxyz”
用程式碼寫來控制規則
設定 android:digits 屬性即可
例如:
android:digits = “abcdef”
有兩種方法可以實現:
方法一:
EditText mEditText = (EditText)findViewById(R.id.MyEditText);
String digits = "abcdef";
mEditText.setKeyListener(DigitsKeyListener.getInstance(digits));
方法二:
EditText mEditText = (EditText)findViewById(R.id.MyEditText);
InputFilter[] filters = new InputFilter[1];
filters[0] = new MyInputFilter("abcdef");
mEditText.setFilters(filters);
public class MyInputFilter extends LoginFilter.UsernameFilterGeneric {
private String mAllowedDigits;
public PopInputFilter( String digits ) {
mAllowedDigits = digits;
}
@Override
public boolean isAllowed(char c) {
if (mAllowedDigits.indexOf(c) != -1) {
return true;
}
return false;
}
}