3. EditText
3.1 EditText的基本屬性
EditText 是一個文本輸入框。下面是基本的屬性:
1.android:layout_width/android:layout_height 設置寬高
2.android:cursorVisible 設置光標可見 boolean值,默認可見
3.android:background 設置背景,一般EditText輸入框會有下劃線的,不想要的話,可以直接設置為 android :background="none"或者自定義背景 android:background="@drawable/bg_edit".
4.android:inputType 輸入框獲取焦點的時候會吊起鍵盤,這時候可以設置鍵盤的輸入格式。
5.android:lines 設置輸入框的行數,在寬高固定的情況下,行數會默認平分寬高。
6.android:scrollHorizontally 設置橫向滑動
7.android:maxLength="20"設置最大的長度為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的可選項:
- 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 的 文本輸入法控制和焦點控制
3.2.1 焦點控制
??有時候我們需要跳轉到某個界面的時候,那個界面有一個EditText,然后是默認獲取焦點的,鍵盤被彈起來。這時候你的尷尬癥煩了,不需要啊 。等我需要點擊的時候再彈起來鍵盤不好么?這里有兩種方式去控制焦點:
- 布局文件中控制
在父布局中失去焦點。加入
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.焦點處理
EditText et_demo=(EditText)findViewById(R.id.edit);
et_demo.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
//判斷獲取焦點
if(hasFocus){
//有焦點的時候怎么處理
}else{
//沒有焦點的時候怎么處理
}
}
});
3.2.2 鍵盤輸入框的焦點控制
??鍵盤輸入框的彈起和隱藏。
android:focusable="false"http://鍵盤永遠不會彈出
//在AndroidManifest.xml 文件中對應的activity設置
<activity
android:name=".EditTextActivity"
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獲得焦點,但是獲得焦點并不會自動彈出鍵盤
3.2.3 鍵盤的回車鍵處理
一般在我們的文本輸入框調起來的時候,都是默認的android:imeOptions="actionUnspecified"可以不寫
有時候你需要修改這個屬性,怎么辦?這時候需要設置:android:imeOptions這個值
1.android :imeOptions="actionDone" ,下方的軟鍵盤變成了“完成”:
2.android :imeOptions="actionGo",軟鍵盤變成“去往”:
3.android :imeOptions="actionSearch ",軟鍵盤變成“搜索”
4.android :imeOptions="actionSend ",軟鍵盤變成“發送”
5.android :imeOptions="actionNext ",軟鍵盤變成“下一個”
6.android:imeOptions="flagNoExtractUi" //使軟鍵盤不全屏顯示,只占用一部分屏幕 同時,這個屬性還能控件軟鍵盤右下角按鍵的顯示內容,默認情況下為回車鍵
3.3 EditText 的部分屬性
3.3.1 輸入數字和字母
//限定edittext能輸入數字和字母,并且默認輸入為數字,如身份證號碼
android:inputType="number" android:digits="0123456789xyzXYZ"
3.3.2 軟鍵盤調起來,界面被擠上去了
使用Manifest中的Activity的android:windowSoftInputMode的"adjustPan"屬性
備注:
【A】stateUnspecified:軟鍵盤的狀態并沒有指定,系統將選擇一個合適的狀態或依賴于主題的設置
【B】stateUnchanged:當這個activity出現時,軟鍵盤將一直保持在上一個activity里的狀態,無論是隱藏還是顯示
【C】stateHidden:用戶選擇activity時,軟鍵盤總是被隱藏
【D】stateAlwaysHidden:當該Activity主窗口獲取焦點時,軟鍵盤也總是被隱藏的
【E】stateVisible:軟鍵盤通常是可見的
【F】stateAlwaysVisible:用戶選擇activity時,軟鍵盤總是顯示的狀態
【G】adjustUnspecified:默認設置,通常由系統自行決定是隱藏還是顯示
【H】adjustResize:該Activity總是調整屏幕的大小以便留出軟鍵盤的空間
【I】adjustPan:當前窗口的內容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能總是看到輸入內容的部分
3.3.3 edittext光標詳解
edittext.requestFocusFromTouch();//讓光標放入到點擊位置。 edittext.requestFocus();//默認方式獲得焦點
EditText editor = (EditText)getCurrentView();//光標處插入 int cursor = editor.getSelectionStart(); editor.getText().insert(cursor,delta);
讓光標移到末端(這樣文字就會向前顯示) EditText et = ... String text = "text"; et.setText(text); et.setSelection(text.length());
android:cursorVisible="false" 隱藏光標
android:background="#00000000"http://不要文本框背景
3.3.4 拓展
1.android:ellipsize="end" 自動隱藏尾部溢出數據,一般用于文字內容過長一行無法全部顯示時
2.android:editable="false" 設置EditText不可編輯
3.android:typeface="monospace" 字型,normal, sans, serif, monospace android:background="@null" 空間背景,這里沒有,指透明
4.android:textColorHint="#ffff00" 設置提示信息文字的顏色,默認為灰色 android:textScaleX="1.5" 控制字與字之間的間距
5.android:textStyle="bold" 字體,bold, italic, bolditalic android:textSize="20dip" 大小
6.android:layout_gravity="center_vertical" 設置控件顯示的位置:默認top,這里居中顯示,還有bottom android:hint="請輸入數字!"設置顯示在空間上的提示信息 android:numeric="integer" 設置只能輸入整數,如果是小數則是:decimal android:singleLine="true" 設置單行輸入,一旦設置為true,則文字不會自動換行。
7.android:password="true" 設置只能輸入密碼
8.android:textColor = "#ff8c00" 字體顏色
3.5 AutoCompleteTextView 自動匹配
??如果你想在自己輸入時候會在輸入框下出現下圖所示的提示,這樣就可以自動匹配。方便省事省力
步驟:
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文件中加上你要展示的所有的參數
<?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中設置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
?? 作為常見的基礎控件之一 ,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都可以設置圖片,但是實際的效果確實不同。background 是將整個Imageview控件作為參照體,整個拉伸,而src是將以自身圖片的大小為參照體,圖片大小不會填滿控件。
4.2 ImageView 常用屬性
1、andorid:src 設置圖片來源。屬性值為android:src="@drawable/圖片名稱"
2、android:adjustViewBounds 用于設置 ImageView 是否調整自己的邊界,來保持所顯示圖片的長寬比例。屬性值為true或false
3、 android:maxHeight 設置 ImageView 的最大高度。需要先設置android:adjustViewBounds為true,否則不起作用。
4、andorid:maxWidth 設置 ImageView 的最大寬度。需要先設置android:adjustViewBounds為true,否則不起作用。
5、 android:scaleType 設置所顯示的圖片如何縮放或移動,以適應ImageView的大小。可選項:fitCenter、fitStart 、 fitEnd、 fitXY 、 center、centerCrop、centerInside、matrix
4.3 ScaleType詳解
● matrix :保持原圖大小、從左上角的點開始,以矩陣形式繪圖。 MATRIX 用圖片的矩陣從左向開始來畫,不做任何拉伸。如果一個100100的ImageView,它的src是1010的小圖,則圖顯示在左上角,如果scr是200200的大圖,則截取它左上的100100做顯示。
● fitXY :把圖片按照指定的大小在View中顯示,拉伸顯示圖片,不保持原比例,填滿View. FIT_XY 不保持圖片橫寬比,把圖片的寬和高分別拉伸或縮放至ImageView的大小。如果是一個100100的ImageView,它的src是2010,則直接把它拉伸為100100后顯示,如果src是200100,則把它縮放為100*100后顯示,此種方法容易導致圖片變形。
● fitStart :把圖片按比例擴大(縮小)到View的寬度,顯示在View的上部分位置 。FIT_START 與 FIT_CENTER 縮放拉伸原則一樣,區別是處理過的圖片居左顯示。
● fitCenter :把圖片按比例擴大(縮小)到View的寬度,居中顯示 。FIT_CENTER 保持橫寬比,對圖片進行拉伸或縮放,原則是:
○ 1)圖片能完整顯示;
○ 2)圖片寬或高至少有一樣與ImageView的相同;
○ 3)處理過的圖片居中顯示。
○ 如果是一個100100的ImageView,它的src是2010,先把圖片等比放大到10050,然后再居中顯示。它的src是100200,會先把圖片等比縮放到50*100,然后再居中顯示。
● fitEnd :把圖片按比例擴大(縮小)到View的寬度,顯示在View的下部分位置 。FIT_END 與 FIT_CENTER縮放拉伸原則一樣,區別是處理過的圖片居右顯示。
● Center : 以原圖的幾何中心點和ImagView的幾何中心點為基準,按圖片的原來size居中顯示,不縮放, 當圖片長/寬超過View的長/寬,則截取圖片的居中部分顯示ImageView的size. 當圖片小于View 的長寬時,只顯示圖片的size,不剪裁。 CENTER 不做任何拉伸,以居中的方式顯示圖片。如果是一個100100的ImageView,它的src是1010的小圖,則圖顯示在的中央,如果src是200200的大圖,截取中間的100100用來顯示。
● centerCrop :以原圖的幾何中心點和ImagView的幾何中心點為基準,按比例擴大(圖片小于View的寬時)圖片的size。 居中顯示,使得圖片長 (寬)等于或大于View的長(寬),并按View的大小截取圖片。 當原圖的size大于ImageView時,按比例縮小圖片,使得長寬中有一向等于ImageView,另一向大于ImageView。 CENTER_CROP 保持圖片橫寬比,以圖片中心為基點進行拉伸顯示,拉伸的原則是填充滿整個ImageView。如果是一個100100的ImageView,它的src是2010,則它會被等比拉伸成200100,然后再截取其中央的100100顯示。如果src是200300的,直接截取中央的100100顯示,不做任何拉伸或縮放。
● centerInside :以原圖的幾何中心點和ImagView的幾何中心點為基準,將圖片的內容完整居中顯示, 通過按比例縮小原來的size使得圖片長(寬)等于或小于ImageView的長(寬)。CENTER_INSIDE 保持圖片橫寬比,以圖片中心為基點進行縮放顯示,縮放的原則是顯示完整個圖片。如果是一個100100的ImageView,它的src是2010,它直接居中顯示。如果src是200100的,先把圖片等比縮小到10050,然后再居中顯示。
一般情況下,設置為centerCrop能獲得較好的適配效果。
4.4 ImageView的常見方法
1、setImageBitmap()
2、setImageDrawable()
3、setImageResource()
盡量不要直接使用setImageBitmap或setImageResource或BitmapFactory.decodeResource來設置一張大圖,因為這些函數在完成decode后,最終都是通過java層的createBitmap來完成的,需要消耗更多內存。
/**
* 以最省內存的方式讀取本地資源的圖片
*
* @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);
}