3. EditText
3.1 EditText的基本屬性
EditText 是一個(gè)文本輸入框。下面是基本的屬性:
1.android:layout_width/android:layout_height 設(shè)置寬高
2.android:cursorVisible 設(shè)置光標(biāo)可見 boolean值易猫,默認(rèn)可見
3.android:background 設(shè)置背景耻煤,一般EditText輸入框會(huì)有下劃線的躁染,不想要的話褪迟,可以直接設(shè)置為 android :background="none"或者自定義背景 android:background="@drawable/bg_edit".
4.android:inputType 輸入框獲取焦點(diǎn)的時(shí)候會(huì)吊起鍵盤,這時(shí)候可以設(shè)置鍵盤的輸入格式薪寓。
5.android:lines 設(shè)置輸入框的行數(shù)攘已,在寬高固定的情況下炮赦,行數(shù)會(huì)默認(rèn)平分寬高。
6.android:scrollHorizontally 設(shè)置橫向滑動(dòng)
7.android:maxLength="20"設(shè)置最大的長(zhǎng)度為20
<EditText
android:id="@+id/et_demo"
android:layout_width="200dp"
android:layout_height="50dp"
android:cursorVisible="false"
android:background="#f00"
android:layout_gravity="center"
android:inputType="number"
android:lines="2"
android:scrollHorizontally="true"
android:maxLines="1"
android:maxLength="20"
/>
3.2 EditText 的InputType 的基本屬性
android:inputType的可選項(xiàng):
- android:inputType="textPersonName"
- android:inputType="textPassword"
- android:inputType="numberPassword"
- android:inputType="textEmailAddress"
- android:inputType="phone"
- android:inputType="textPostalAddress"
- android:inputType="time"
- android:inputType="date"
- android:inputType="number"
3.2 EditText 的 文本輸入法控制和焦點(diǎn)控制
3.2.1 焦點(diǎn)控制
??有時(shí)候我們需要跳轉(zhuǎn)到某個(gè)界面的時(shí)候样勃,那個(gè)界面有一個(gè)EditText,然后是默認(rèn)獲取焦點(diǎn)的吠勘,鍵盤被彈起來。這時(shí)候你的尷尬癥煩了峡眶,不需要啊 剧防。等我需要點(diǎn)擊的時(shí)候再?gòu)椘饋礞I盤不好么?這里有兩種方式去控制焦點(diǎn):
- 布局文件中控制
在父布局中失去焦點(diǎn)幌陕。加入
android:focusable="true"
android:focusableInTouchMode="true"
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:focusable="true"
android:focusableInTouchMode="true"
>
<EditText
android:id="@+id/et_demo"
android:layout_width="200dp"
android:layout_height="50dp"
android:cursorVisible="false"
android:background="#f00"
android:layout_gravity="center"
android:inputType="number"
android:lines="2"
android:scrollHorizontally="true"
android:maxLines="1"
android:maxLength="20"
/>
</LinearLayout>
2.代碼控制
EditText et_demo=(EditText)findViewById(R.id.edit);
et_demo.setFocusable(true);
et_demo.setFocusableInTouchMode(true);
3.焦點(diǎn)處理
EditText et_demo=(EditText)findViewById(R.id.edit);
et_demo.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
//判斷獲取焦點(diǎn)
if(hasFocus){
//有焦點(diǎn)的時(shí)候怎么處理
}else{
//沒有焦點(diǎn)的時(shí)候怎么處理
}
}
});
3.2.2 鍵盤輸入框的焦點(diǎn)控制
??鍵盤輸入框的彈起和隱藏诵姜。
android:focusable="false"http://鍵盤永遠(yuǎn)不會(huì)彈出
//在AndroidManifest.xml 文件中對(duì)應(yīng)的activity設(shè)置
<activity
android:name=".EditTextActivity"
android:windowSoftInputMode="adjustUnspecified|stateHidden"/>//不自動(dòng)彈出鍵盤
//關(guān)閉鍵盤(比如輸入結(jié)束后執(zhí)行)
InputMethodManager imm =(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(etEditText.getWindowToken(), 0);
//自動(dòng)彈出鍵盤
((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).toggleSoftInput(0,InputMethodManager.HIDE_NOT_ALWAYS);
etEditText.requestFocus();//讓EditText獲得焦點(diǎn),但是獲得焦點(diǎn)并不會(huì)自動(dòng)彈出鍵盤
3.2.3 鍵盤的回車鍵處理
一般在我們的文本輸入框調(diào)起來的時(shí)候搏熄,都是默認(rèn)的android:imeOptions="actionUnspecified"可以不寫
有時(shí)候你需要修改這個(gè)屬性棚唆,怎么辦?這時(shí)候需要設(shè)置:android:imeOptions這個(gè)值
1.android :imeOptions="actionDone" ,下方的軟鍵盤變成了“完成”:
2.android :imeOptions="actionGo",軟鍵盤變成“去往”:
3.android :imeOptions="actionSearch ",軟鍵盤變成“搜索”
4.android :imeOptions="actionSend ",軟鍵盤變成“發(fā)送”
5.android :imeOptions="actionNext ",軟鍵盤變成“下一個(gè)”
6.android:imeOptions="flagNoExtractUi" //使軟鍵盤不全屏顯示心例,只占用一部分屏幕 同時(shí),這個(gè)屬性還能控件軟鍵盤右下角按鍵的顯示內(nèi)容,默認(rèn)情況下為回車鍵
3.3 EditText 的部分屬性
3.3.1 輸入數(shù)字和字母
//限定edittext能輸入數(shù)字和字母宵凌,并且默認(rèn)輸入為數(shù)字,如身份證號(hào)碼
android:inputType="number" android:digits="0123456789xyzXYZ"
3.3.2 軟鍵盤調(diào)起來止后,界面被擠上去了
使用Manifest中的Activity的android:windowSoftInputMode的"adjustPan"屬性
備注:
【A】stateUnspecified:軟鍵盤的狀態(tài)并沒有指定瞎惫,系統(tǒng)將選擇一個(gè)合適的狀態(tài)或依賴于主題的設(shè)置
【B】stateUnchanged:當(dāng)這個(gè)activity出現(xiàn)時(shí),軟鍵盤將一直保持在上一個(gè)activity里的狀態(tài)译株,無論是隱藏還是顯示
【C】stateHidden:用戶選擇activity時(shí)瓜喇,軟鍵盤總是被隱藏
【D】stateAlwaysHidden:當(dāng)該Activity主窗口獲取焦點(diǎn)時(shí),軟鍵盤也總是被隱藏的
【E】stateVisible:軟鍵盤通常是可見的
【F】stateAlwaysVisible:用戶選擇activity時(shí)歉糜,軟鍵盤總是顯示的狀態(tài)
【G】adjustUnspecified:默認(rèn)設(shè)置乘寒,通常由系統(tǒng)自行決定是隱藏還是顯示
【H】adjustResize:該Activity總是調(diào)整屏幕的大小以便留出軟鍵盤的空間
【I】adjustPan:當(dāng)前窗口的內(nèi)容將自動(dòng)移動(dòng)以便當(dāng)前焦點(diǎn)從不被鍵盤覆蓋和用戶能總是看到輸入內(nèi)容的部分
3.3.3 edittext光標(biāo)詳解
edittext.requestFocusFromTouch();//讓光標(biāo)放入到點(diǎn)擊位置。 edittext.requestFocus();//默認(rèn)方式獲得焦點(diǎn)
EditText editor = (EditText)getCurrentView();//光標(biāo)處插入 int cursor = editor.getSelectionStart(); editor.getText().insert(cursor,delta);
讓光標(biāo)移到末端(這樣文字就會(huì)向前顯示) EditText et = ... String text = "text"; et.setText(text); et.setSelection(text.length());
android:cursorVisible="false" 隱藏光標(biāo)
android:background="#00000000"http://不要文本框背景
3.3.4 拓展
1.android:ellipsize="end" 自動(dòng)隱藏尾部溢出數(shù)據(jù)匪补,一般用于文字內(nèi)容過長(zhǎng)一行無法全部顯示時(shí)
2.android:editable="false" 設(shè)置EditText不可編輯
3.android:typeface="monospace" 字型伞辛,normal, sans, serif, monospace android:background="@null" 空間背景烂翰,這里沒有,指透明
4.android:textColorHint="#ffff00" 設(shè)置提示信息文字的顏色蚤氏,默認(rèn)為灰色 android:textScaleX="1.5" 控制字與字之間的間距
5.android:textStyle="bold" 字體甘耿,bold, italic, bolditalic android:textSize="20dip" 大小
6.android:layout_gravity="center_vertical" 設(shè)置控件顯示的位置:默認(rèn)top,這里居中顯示竿滨,還有bottom android:hint="請(qǐng)輸入數(shù)字佳恬!"設(shè)置顯示在空間上的提示信息 android:numeric="integer" 設(shè)置只能輸入整數(shù),如果是小數(shù)則是:decimal android:singleLine="true" 設(shè)置單行輸入姐呐,一旦設(shè)置為true殿怜,則文字不會(huì)自動(dòng)換行。
7.android:password="true" 設(shè)置只能輸入密碼
8.android:textColor = "#ff8c00" 字體顏色
3.5 AutoCompleteTextView 自動(dòng)匹配
??如果你想在自己輸入時(shí)候會(huì)在輸入框下出現(xiàn)下圖所示的提示曙砂,這樣就可以自動(dòng)匹配头谜。方便省事省力
步驟:
1.在你的layout文件中
<AutoCompleteTextView
android:id="@+id/auto"
android:layout_width="200dp"
android:layout_height="50dp"
android:layout_marginTop="20dp"
android:hint="賬戶"
/>
2.在 values/string.xml文件中加上你要展示的所有的參數(shù)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="countries_array">
<item>Afghanistan</item>
<item>Albania</item>
<item>Algeria</item>
<item>American Samoa</item>
<item>Andorra</item>
<item>Angola</item>
<item>Anguilla</item>
<item>Antarctica</item>
...
</string-array>
</resources>
3.在Activity中設(shè)置Adapter適配
AutoCompleteTextView auto= (AutoCompleteTextView) findViewById(R.id.auto);
String[] countries = getResources().getStringArray(R.array.countries_array);
ArrayAdapter<String> adapter =new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, countries);
auto.setAdapter(adapter);
4. ImageView
?? 作為常見的基礎(chǔ)控件之一 ,ImageView 的使用頻率非常高鸠澈。
<ImageView
android:id="@+id/image"
android:layout_width="150dp"
android:layout_height="150dp"
android:src="@mipmap/ic_launcher_round"
android:background="#f0f0"/>
4.1 background 和 src
在Imageview中柱告,background和src都可以設(shè)置圖片,但是實(shí)際的效果確實(shí)不同笑陈。background 是將整個(gè)Imageview控件作為參照體际度,整個(gè)拉伸,而src是將以自身圖片的大小為參照體涵妥,圖片大小不會(huì)填滿控件乖菱。
4.2 ImageView 常用屬性
1、andorid:src 設(shè)置圖片來源蓬网。屬性值為android:src="@drawable/圖片名稱"
2窒所、android:adjustViewBounds 用于設(shè)置 ImageView 是否調(diào)整自己的邊界,來保持所顯示圖片的長(zhǎng)寬比例帆锋。屬性值為true或false
3吵取、 android:maxHeight 設(shè)置 ImageView 的最大高度。需要先設(shè)置android:adjustViewBounds為true锯厢,否則不起作用皮官。
4、andorid:maxWidth 設(shè)置 ImageView 的最大寬度实辑。需要先設(shè)置android:adjustViewBounds為true捺氢,否則不起作用。
5剪撬、 android:scaleType 設(shè)置所顯示的圖片如何縮放或移動(dòng)摄乒,以適應(yīng)ImageView的大小。可選項(xiàng):fitCenter缺狠、fitStart 、 fitEnd萍摊、 fitXY 挤茄、 center、centerCrop冰木、centerInside穷劈、matrix
4.3 ScaleType詳解
● matrix :保持原圖大小、從左上角的點(diǎn)開始踊沸,以矩陣形式繪圖歇终。 MATRIX 用圖片的矩陣從左向開始來畫,不做任何拉伸逼龟。如果一個(gè)100100的ImageView评凝,它的src是1010的小圖,則圖顯示在左上角腺律,如果scr是200200的大圖奕短,則截取它左上的100100做顯示。
● fitXY :把圖片按照指定的大小在View中顯示匀钧,拉伸顯示圖片翎碑,不保持原比例,填滿View. FIT_XY 不保持圖片橫寬比之斯,把圖片的寬和高分別拉伸或縮放至ImageView的大小日杈。如果是一個(gè)100100的ImageView,它的src是2010佑刷,則直接把它拉伸為100100后顯示莉擒,如果src是200100,則把它縮放為100*100后顯示项乒,此種方法容易導(dǎo)致圖片變形啰劲。
● fitStart :把圖片按比例擴(kuò)大(縮小)到View的寬度,顯示在View的上部分位置 檀何。FIT_START 與 FIT_CENTER 縮放拉伸原則一樣蝇裤,區(qū)別是處理過的圖片居左顯示。
● fitCenter :把圖片按比例擴(kuò)大(縮小)到View的寬度频鉴,居中顯示 栓辜。FIT_CENTER 保持橫寬比,對(duì)圖片進(jìn)行拉伸或縮放垛孔,原則是:
○ 1)圖片能完整顯示藕甩;
○ 2)圖片寬或高至少有一樣與ImageView的相同;
○ 3)處理過的圖片居中顯示周荐。
○ 如果是一個(gè)100100的ImageView狭莱,它的src是2010僵娃,先把圖片等比放大到10050,然后再居中顯示腋妙。它的src是100200默怨,會(huì)先把圖片等比縮放到50*100,然后再居中顯示骤素。
● fitEnd :把圖片按比例擴(kuò)大(縮小)到View的寬度匙睹,顯示在View的下部分位置 。FIT_END 與 FIT_CENTER縮放拉伸原則一樣济竹,區(qū)別是處理過的圖片居右顯示痕檬。
● Center : 以原圖的幾何中心點(diǎn)和ImagView的幾何中心點(diǎn)為基準(zhǔn),按圖片的原來size居中顯示送浊,不縮放梦谜, 當(dāng)圖片長(zhǎng)/寬超過View的長(zhǎng)/寬,則截取圖片的居中部分顯示ImageView的size. 當(dāng)圖片小于View 的長(zhǎng)寬時(shí)袭景,只顯示圖片的size,不剪裁改淑。 CENTER 不做任何拉伸,以居中的方式顯示圖片浴讯。如果是一個(gè)100100的ImageView朵夏,它的src是1010的小圖,則圖顯示在的中央榆纽,如果src是200200的大圖仰猖,截取中間的100100用來顯示。
● centerCrop :以原圖的幾何中心點(diǎn)和ImagView的幾何中心點(diǎn)為基準(zhǔn)奈籽,按比例擴(kuò)大(圖片小于View的寬時(shí))圖片的size饥侵。 居中顯示,使得圖片長(zhǎng) (寬)等于或大于View的長(zhǎng)(寬),并按View的大小截取圖片衣屏。 當(dāng)原圖的size大于ImageView時(shí)躏升,按比例縮小圖片,使得長(zhǎng)寬中有一向等于ImageView,另一向大于ImageView狼忱。 CENTER_CROP 保持圖片橫寬比膨疏,以圖片中心為基點(diǎn)進(jìn)行拉伸顯示,拉伸的原則是填充滿整個(gè)ImageView钻弄。如果是一個(gè)100100的ImageView佃却,它的src是2010,則它會(huì)被等比拉伸成200100窘俺,然后再截取其中央的100100顯示饲帅。如果src是200300的,直接截取中央的100100顯示,不做任何拉伸或縮放灶泵。
● centerInside :以原圖的幾何中心點(diǎn)和ImagView的幾何中心點(diǎn)為基準(zhǔn)育八,將圖片的內(nèi)容完整居中顯示, 通過按比例縮小原來的size使得圖片長(zhǎng)(寬)等于或小于ImageView的長(zhǎng)(寬)赦邻。CENTER_INSIDE 保持圖片橫寬比单鹿,以圖片中心為基點(diǎn)進(jìn)行縮放顯示,縮放的原則是顯示完整個(gè)圖片深纲。如果是一個(gè)100100的ImageView,它的src是2010劲妙,它直接居中顯示湃鹊。如果src是200100的,先把圖片等比縮小到10050镣奋,然后再居中顯示币呵。
一般情況下,設(shè)置為centerCrop能獲得較好的適配效果侨颈。
4.4 ImageView的常見方法
1余赢、setImageBitmap()
2、setImageDrawable()
3哈垢、setImageResource()
盡量不要直接使用setImageBitmap或setImageResource或BitmapFactory.decodeResource來設(shè)置一張大圖妻柒,因?yàn)檫@些函數(shù)在完成decode后,最終都是通過java層的createBitmap來完成的耘分,需要消耗更多內(nèi)存举塔。
/**
* 以最省內(nèi)存的方式讀取本地資源的圖片
*
* @param context
* @param resId
* @return
*/
private Bitmap readBitMap(Context context, int resId) {
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
// 獲取資源圖片
InputStream is = context.getResources().openRawResource(resId);
return BitmapFactory.decodeStream(is, null, opt);
}