第六章 Android常见的UI基础控件(二)

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"
        />

editText属性

3.2 EditText 的InputType 的基本属性

android:inputType的可选项:

  1. android:inputType="textPersonName"
  2. android:inputType="textPassword"
  3. android:inputType="numberPassword"
  4. android:inputType="textEmailAddress"
  5. android:inputType="phone"
  6. android:inputType="textPostalAddress"
  7. android:inputType="time"
  8. android:inputType="date"
  9. android:inputType="number"

3.2 EditText 的 文本输入法控制和焦点控制

3.2.1 焦点控制

  有时候我们需要跳转到某个界面的时候,那个界面有一个EditText,然后是默认获取焦点的,键盘被弹起来。这时候你的尴尬症烦了,不需要啊 。等我需要点击的时候再弹起来键盘不好么?这里有两种方式去控制焦点:

  1. 布局文件中控制
    在父布局中失去焦点。加入
    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"//键盘永远不会弹出
//在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"//不要文本框背景

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);  
        }  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容