EditText 集锦 - 开发中常用的用法及遇到的各种坑

系统管理员 2022-03-19 03:36 445阅读 0赞

前言

EditText ,文本输入框,一个再熟悉不过的的控件,在开发当中,我们需要经常用到。这边文章,主要是记录 EditText 的常用用法,需要的时候可以直接复制张贴,提高效率。同时,本文章会持续更新,建议收藏起来。


常用的基本属性

该片段的内容来自于

重拾Android之路之EditText

EditText属性(API 24)

android:hint //设置hint提示文本

android:textColorHint //设置hint提示文字颜色

android:textColor //设置文字颜色

android:textSize //设置文本字体大小

android:textStyle //设置文本字体样式,bold(加粗),italic(倾斜),normal(默认是正常字体).

android:numeric //控制EditText输入数字的类型 decimal(浮点数),integer(正整数),signed(带+ -号的整数).注意:该属性在使用时提示已过时,建议使用android:inputType属性替代.

android:singleLine //设置是否单行输入 true(单行输入),false(会自动换行).注意:该属性在使用时提示已过时,建议使用android:maxLines=”1”属性替代.

android:password=“true” //以密文的形式显示输入的文本.注意:该属性在使用时提示已过时,建议使用android:inputType属性替代.

android:textAlignment //设置EditText中文本显示的位置,center(居中),inherit(默认,居左边显示),viewStart(居左显示),viewEnd(居右显示),textStart(居左显示),textEnd(居右显示).这里需要注意的是最低支持的API版本是17,前两个可以在API14中使用,而后面使用就会报红线…

android:textColorHighlight //设置被选中字体的颜色.默认为 Theme 主题中的 “colorAccent”的颜色.

textCursorDrawable //设置被光标的颜色.默认为 Theme 主题中的 “colorAccent”的颜色.

android:textScaleX //设置文本的水平缩放系数.

android:typeface //设置hint提示文本的字体.normal(默认),monospace,sans,serif.这里就不解释了,大家试一下就能看出效果.

android:background //设置EditText背景.”@null”设置背景为透明.当我们设置背景后,EditText的那条线就会消失.

android:textAppearance //设置文本的颜色,字体,大小和样式.

android:digits //设置只接收指定的文本内容.

android:phoneNumber=“true” //设置输入电话号码.注意:该属性在使用时提示已过时,建议使用android:inputType属性替代.

android:editable //设置EditText是否可以编辑.当你设置为true,会提示你该EditText已经是可编辑的.设置为false时会提示使用inputType替代.

android:inputType //设置文本的类型,用于帮助输入法显示合适的键盘类型.

android:maxLength //设置EditText最多接受的文本的个数.

android:lines //设置EditText显示的行数,设置两行就显示两行,即使第二行没有数据.

android:lineSpacingExtra //设置行间距.

android:lineSpacingMultiplier //设置行间距的倍数. 如设置成1.5倍.


输入法相关

设置默认输入法

有时候为了提高用户体验,在弹出输入法时需要设置默认的输入状态,比如单词应用弹出输入法时,输入法最好是在英文输入状态下。如果是字典应用,弹出输入法时最好是在中文输入状态下,Android 并没有提供设置默认的输入状态的接口,但我们可以通过如下方法一样能够达到想要的效果:

默认中文:

mEditText.setInputType(EditorInfo.TYPE_CLASS_TEXT);

默认英文:

mEditText.setInputType(EditorInfo.TYPE_TEXT_VARIATION_URI)

EditText 默认获取焦点

EditText 默认获取焦点,并弹出键盘,这本来是默认的行为。但有些情况,会因为焦点被别的控件获取了,我们又想让它自动获取焦点,并自动弹出键盘。这时候,可以采用下面的方法

  1. /** * EditText获取焦点并显示软键盘 */
  2. public static void showSoftInputFromWindow(Activity activity, EditText editText) {
  3. editText.setFocusable(true);
  4. editText.setFocusableInTouchMode(true);
  5. editText.requestFocus();
  6. //显示软键盘
  7. activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
  8. //如果上面的代码没有弹出软键盘 可以使用下面另一种方式
  9. //InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
  10. // imm.showSoftInput(editText, 0);
  11. }

取消 EditText 默认获取焦点的行为

在EditText的父级控件中找一个,添加这两个属性:

  1. android:focusable="true"
  2. android:focusableInTouchMode="true"
  3. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:focusable="true"
  8. android:focusableInTouchMode="true"
  9. ><!-- 这两句是为了取消自动获取焦点 -->
  10. <EditText
  11. android:id="@+id/search_edittext"
  12. android:layout_width="fill_parent"
  13. android:layout_height="wrap_content"
  14. android:layout_marginTop="15dp"
  15. android:background="@drawable/search_bar_edit_bg"
  16. android:drawableLeft="@drawable/search_bar_icon_normal"
  17. android:hint="搜索"
  18. android:selectAllOnFocus="true"
  19. android:singleLine="true"
  20. </RelativeLayout>

监听输入法中的回车按钮

比如, QQ, 讯飞,搜狗输入法下面有个回车按钮,有时候我们按下按钮,希望立即提交内容。这时候,可以通过监听输入法按下的 key 来实现

  1. mEt.setOnKeyListener(new View.OnKeyListener() {
  2. @Override
  3. public boolean onKey(View v, int keyCode, KeyEvent event) {
  4. if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) {
  5. Log.i(TAG, "手指弹起时执行确认功能");
  6. return true;
  7. }
  8. return false;
  9. }
  10. });

限制输入框的输入内容

监听 EditText 的输入状态

  • 像新浪微博一样,提醒还可以输入多少字
  • 限制最多可以输入多少字

这些都可以通过监听 EditText TextChangedListener 实现

  1. mInputEditTxt.addTextChangedListener(new TextWatcher() {
  2. @Override
  3. public void beforeTextChanged(CharSequence s, int start, int count, int after) {
  4. }
  5. @Override
  6. public void onTextChanged(CharSequence s, int start, int before, int count) {
  7. Log.i(TAG, "监听EditText输入内容的变化,在这里可以监听输入内容的长度。");
  8. }
  9. @Override
  10. public void afterTextChanged(Editable s) {
  11. Log.i(TAG, "这里可以实现所输即所得,用户输入的同时可以立即在这里根据输入内容执行操作,显示搜索结果!");
  12. }
  13. });

限制输入多少字符

在开发当中,我们通常需要对 text 的输入字符进行限制输入,比如限制输入 30 个字符,虽然我们可以直接调用 setMaxLength
方法来限制输入,但是这样会有一个问题,就是当你的 text 超过 30 个字符的时候,你调用 mEtText.setText ,这时候会报错。因此,最好,还是采用如下的方法, addTextChangedListener 监听文本变化,在字符串变化的时候对文本长度进行截取,

  1. public static final int MAX_LEN = 30;
  2. if (!TextUtils.isEmpty(mValue)) {
  3. int len = Math.min(mValue.length(), MAX_LEN);
  4. mValue = mValue.substring(0, len);
  5. mEtText.setText(mValue);
  6. mEtText.setSelection(mValue.length());
  7. }
  8. mEtText.addTextChangedListener(new TextWatcher() {
  9. @Override
  10. public void beforeTextChanged(CharSequence s, int start, int count, int after) {
  11. }
  12. @Override
  13. public void onTextChanged(CharSequence s, int start, int before, int count) {
  14. Editable text = mEtText.getText();
  15. if (TextUtils.isEmpty(text)) {
  16. return;
  17. }
  18. if (text.length() > MAX_LEN) {
  19. mEtText.setText(text.subSequence(0, MAX_LEN));
  20. mEtText.setSelection(mEtText.getText().length());
  21. }
  22. }
  23. @Override
  24. public void afterTextChanged(Editable s) {
  25. }
  26. });

限制输入内容

有时候,输入框中,我们想限制输入内容,比如禁止输入表情,禁止输入中文等,这时候,可以使用 editText.setFilters(filters) 的方法。下面,列举了一些常用的限制。

  1. public class InputTxtFilter{
  2. public static final int INPUT_TYPE_EN = 0x01;
  3. public static final int INPUT_TYPE_CH = 0x02;
  4. private static final String[] SPELL = new String[]{
  5. "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
  6. "ā","á","ǎ","à","ō","ó","ǒ","ò","ē","é","ě","è","ī","í","ǐ","ì","ū","ú","ǔ","ù","ǖ","ǘ","ǚ","ǜ","ü"
  7. };
  8. private static char[] chineseParam = new char[]{ '」',',','。','?','…',':','~','【','#','、','%','*','&','$','(','‘','’','“','”','『','〔','{','【'
  9. ,'¥','£','‖','〖','《','「','》','〗','】','}','〕','』','”',')','!',';','—'};
  10. private InputTxtFilter( ){
  11. }
  12. public static void inputFilter( final Context context, final EditText editText, final int type, final int inputLimit){
  13. InputFilter[] filters = new InputFilter[1];
  14. filters[0] = new InputFilter.LengthFilter(inputLimit){
  15. public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend){
  16. boolean isRightCharater = false;
  17. if(type == INPUT_TYPE_EN){
  18. isRightCharater = isLetter(source.toString());
  19. }else if(type == INPUT_TYPE_CH){
  20. isRightCharater = isChineseWord(source.toString());
  21. }
  22. if ( !isRightCharater|| dest.toString( ).length( )>=inputLimit ){
  23. return "";
  24. }
  25. return source;
  26. }
  27. };
  28. editText.setFilters(filters);
  29. }
  30. /** * 检测String是否全是中文 * */
  31. public static boolean isChineseWord( String name ){
  32. boolean res=true;
  33. char[] cTemp = name.toCharArray( );
  34. for( int i = 0; i < name.length( ); i++ ){
  35. if( !isChinese( cTemp[ i ] ) ){
  36. res=false;
  37. break;
  38. }
  39. }
  40. return res;
  41. }
  42. /** * 是否为英文字母 * * */
  43. public static boolean isLetter( String inputStr ){
  44. char[] inputArray = inputStr.toCharArray( );
  45. List<String> spellList = Arrays.asList( SPELL );
  46. for( char input : inputArray ){
  47. if( !spellList.contains( input + "" ) ){
  48. return false;
  49. }
  50. }
  51. return true;
  52. }
  53. /** * 判定输入汉字 * @param c */
  54. public static boolean isChinese( char c ){
  55. for( char param : chineseParam ){
  56. if( param == c ){
  57. return false;
  58. }
  59. }
  60. Character.UnicodeBlock ub = Character.UnicodeBlock.of( c );
  61. if ( ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
  62. || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
  63. || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
  64. || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
  65. || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
  66. || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS ){
  67. return true;
  68. }
  69. return false;
  70. }
  71. }
  72. **InputTxtFilter.inputFilter(this, mInputEditTxt, InputTxtFilter.INPUT_TYPE_EN, 5);**

常见的坑

Android:EditText设置密码可见与不可见

  1. //从密码不可见模式变为密码可见模式(行得通)
  2. et_password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
  3. //从密码可见模式变为密码不可见模式(行不通)
  4. et_password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

解决方法 :动态修改TransformationMethod

  1. //从密码不可见模式变为密码可见模式
  2. et_password.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
  3. //从密码可见模式变为密码不可见模式
  4. et_password.setTransformationMethod(PasswordTransformationMethod.getInstance())

题外话

今天 214 情人节,你有对象了吗?如果碰到心仪的人,大胆去追求吧。不要一直藏着掖着,这样,在将来的某一天,你肯定会后悔的。


Android 技术人,希望让你看到程序猿不同的一面,除了分享 Coding,,还有职场心得,面试经验,学习心得,人生感悟等等。希望通过该公众号,让大家看到,我们不只会敲代码,我们还会。。。。。。

Android 技术人

发表评论

表情:
评论列表 (有 0 条评论,445人围观)

还没有评论,来说两句吧...

相关阅读

    相关 BLE开发各种

    这段时间在做低功耗蓝牙 (BLE) 应用的开发(并不涉及蓝牙协议栈)。总体感觉 Android BLE 还是不太稳定,开发起来也是各种痛苦。这里记录一些杂项和开发中遇到的问题及