EditText属性及一些常用用法

推荐阅读:
android全屏/沉浸式状态栏下,各种键盘挡住输入框解决办法
Android仿微信朋友圈评论功能

继承关系:

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"//键盘永远不会弹出
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,让他率先获取焦点:

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、这里2android: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.2android: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
//:主界面会缩放,用来放置软键盘.

EditText属性及一些常用用法_第1张图片

EditText属性及一些常用用法_第2张图片

adjustPan
//:主界面不会缩放,会向上移来放置软键盘

EditText属性及一些常用用法_第3张图片

EditText属性及一些常用用法_第4张图片

上面两个不同的地方在于,如果内容是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

参考:

Activity启动后EditText是否自动弹出输入法虚拟键盘的问题

Android文本输入框EditText方法说明和属性

Android EditView属性详细介绍

【Android进阶学习】监听EditText的变化

EditText弹出软键盘遮住输入框问题

限制只能输入指定的字符

参考:
https://zhidao.baidu.com/question/303588034660071684.html?qq-pf-to=pcqq.group

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;
    }
}

你可能感兴趣的:(view)