推荐阅读:
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
//:主界面会缩放,用来放置软键盘.

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

参考:

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

更多相关文章

  1. Android(安卓)EditText自动获取焦点并弹出软键盘,解决EditText在
  2. Android(安卓)中不弹出软键盘的方法
  3. Android系统中设置TextView的行间距(非行高)
  4. Android关于LinearLayout和RelativeLayout背景设置的区别
  5. android开发常见问题
  6. 设置Android(安卓)SDK tools工作路径环境变量
  7. android小知识点
  8. Android中TextVIew一些属性
  9. 设置TextView文字居中,代码实现android:layout_gravity

随机推荐

  1. Mysql按条件计数多种实现方法详解
  2. MySQL定时备份方案(利用Linux crontab)
  3. MySQL中使用去重distinct方法的示例详解
  4. mysql-connector-java.jar包的下载过程详
  5. 浅谈MySQL 统计行数的 count
  6. 快速学习MySQL基础知识
  7. 简单了解MySQL存储引擎
  8. MySQL中SQL分页查询的几种实现方法及优缺
  9. 解决Navicat导入数据库数据结构sql报错da
  10. 浅谈mysql导出表数据到excel关于datetime