Bootstrap

Android EditText使用总结

设置EditText的背景

通过设置以下属性来设置EditText的背景

 android:background="@drawable/decoration"

decoration.xml 的内容

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <corners android:radius="12dp"/>
    <stroke android:width="1dp" android:color="#E1E1E1"/>

</shape>

如果不需要背景,想去掉EditText自带的下划线,可以用以下设置

android:background="@null"

设置EditText的光标

  • 显示光标
    Java代码方式控制显示
   mEditText.requestFocus();//获取焦点 光标出现

EditText隐藏的方法:

editText.setCursorVisible(false);

EditText光标 显示的方法:

editText.setCursorVisible(true);

使用XML文件控制光标显示

cursorVisible 中
true为显示  
false为隐藏光标
android:cursorVisible="true"
android:cursorVisible="false"
  • 控制EditText获取焦点

当点击EditText才会获取焦点,才会显示光标

Java代码方式设置

EditText mEditText = (EditText) findViewById(R.id.et);
mEditText.setFocusable(true);
mEditText.setFocusableInTouchMode(true);

XML方式设置

android:focusable="true"
android:focusableInTouchMode="true"

主动显示光标

mEditText.requestFocus();//获取焦点 光标出现

监听EditText焦点变化 当获取焦点后 hasFocus 为true

mEditText.setOnFocusChangeListener(new android.view.View.OnFocusChangeListener() {

                @Override
                public void onFocusChange(View v, boolean hasFocus) {
                    if (hasFocus) {
                        // 获得焦点
                    } else {
                        // 失去焦点
                    }
                }
            });

设置EditText不换行,只显示单行

EditText的xml布局文件里面有很多有关于行数的属性,
除了已经过时的singleLines 属性,现在还有maxLinesLines属性可以设置。

然而你会发现,即使同时设置了maxLines=”1”和lines=”1”,EditText依然是可以换行的。

其实很简单,只需要加上一条属性:

android:inputType="text"

这时你设置的maxLines和lines就起作用了。

Activity启动后EditText自动弹出键盘

  • 自动弹窗键盘

方式一

 给activity配置加入属性android:windowSoftInputMode=”adjustResize”

方式二

new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
    @Override
    public void run() {
            InputMethodManager inputManager = (InputMethodManager) editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);  
    inputManager.showSoftInput(editText, 0);  
    }
},500);

注意:此时由于刚跳到一个新的界面,界面未加载完全而无法弹出软键盘。此时应该适当的延迟弹出软键盘,如500毫秒(保证界面的数据加载完成,如果500毫秒仍未弹出,则延长至1000毫秒)。

  • 隐藏键盘
    在开发过程中,经常会碰到Activity中包含EditText控件时会自动弹出虚拟键盘的情形,其实这是由于EditText自动获得焦点的缘故,只要让EditText失去焦点就行了

方式一
在Manifest.xml文件中相应的Activity下添加如下代码即可

android:windowSoftInputMode=”stateHidden”

方式二
让EditText失去焦点,用EditText的clearFocus即可:

EditText edit = (EditText)findViewById(R.id.edit); 
edit.clearFocus();

方式三
强制隐藏Android输入法窗口

EditText edit = (EditText)findViewById(R.id.edit); 
InputMethodManager imm = 
(InputMethodManager)getSystemService(INPUT_METHOD_SERVICE); 
imm.hideSoftInputFromWindow(edit.getWindowToken(), 0);

方式四
EditText始终不弹出虚拟键盘

EditText edit = (EditText)findViewById(R.id.edit); 
edit.setInputType(InputType.TYPE_NULL);

监听EditText的内容变化

 EditText et = (EditText) findViewById(R.id.et);
    TextWatcher watcher = new TextWatcher() {
    
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    };
    et.addTextChangedListener(watcher);
beforeTextChanged(CharSequence s, int start, int count, int after)

s: 修改之前的内容
start: 字符串中即将发生修改的位置,如果是新增则为内容改变前光标的位置,如果是删除则为删除前被删除的字符的位置。
count: 字符串中即将被修改的文字的长度。如果是新增的话则为0,删除则为1
after: 被修改的文字修改之后的长度。如果是删除的话则为0,新增为1

onTextChanged(CharSequence s, int start, int before, int count)

s: 改变后的字符串
start: 有变动的字符串的下标,如果是新增则为新增内容的下标,如果是删除则为被删除内容的下标。
before: 被改变的字符串长度,如果是新增则为0,如果是删除则为1
count: 添加的字符串长度,如果是删除则为0,新增为1

afterTextChanged(Editable s)
s: 修改后的内容

EditText响应软键盘事件

  • android 软件盘事件响应

在android中,有时需要对EditText实现软件盘监听的场景。当android按下软键盘的时候,响应完成、发送、搜索或者其他事件。
Google 提供了 EditorInfo、 KeyEvent 的一些方法,能够实现我们需要的功能。详细可研究:EditorInfo.class 和 KeyEvent.class.

输入回车键隐藏输入键盘的方法
如果布局中包含多个EditText,可以为每个EditText控件设置android:singleLine=”true”,弹出的软盘输入法中回车键为next,直到最后一个获取焦点后显示为Done,点击Done后,隐藏软键输入盘。将EditText的imeOptions属性设置android:imeOptions=”actionDone”,则不管是不是最后一个EditText,点击回车键即隐藏输入法。

监听Enter的事件,编写Enter的事件响应。设置文本框的OnKeyListener,当keyCode ==KeyEvent.KEYCODE_ENTER的时候,表明Enter键被按下,就可以编写自己事件响应功能了。

XML文件如下:

<EditText
          android:id= "@+id/editTextId"
          android:layout_width= "fill_parent"
          android:layout_height= "50dp"
          android:imeOptions= "actionDone"
          android:hint= "@string/task_new_one"
          android:textSize= "15sp"
          android:singleLine= "true"
          android:paddingLeft= "5dp"
          android:layout_gravity= "center"
          android:background= "@drawable/rectangle"
          android:inputType= "text"
          >
  </EditText>

把EditText的ImeOptions属性设置成不同的值,Enter键上可以显示不同的文字或图案。

actionNone : 回车键,按下后光标到下一行
actionGo : Go,
actionSearch : 一个放大镜
actionSend : Send
actionNext : Next
actionDone : Done,隐藏软键盘,即使不是最后一个文本输入框

通过修改 android:imeOptions 来改变默认的键盘显示文本。常用的常量值如下:

  • actionUnspecified 未指定,对应常量EditorInfo.IME_ACTION_UNSPECIFIED.效果:

在这里插入图片描述

  • actionNone 没有动作,对应常量EditorInfo.IME_ACTION_NONE 效果:

在这里插入图片描述

  • actionGo 去往,对应常量EditorInfo.IME_ACTION_GO 效果:

在这里插入图片描述

  • actionSearch 搜索,对应常量EditorInfo.IME_ACTION_SEARCH 效果:

在这里插入图片描述

  • actionSend 发送,对应常量EditorInfo.IME_ACTION_SEND 效果:

在这里插入图片描述

  • actionNext 下一个,对应常量EditorInfo.IME_ACTION_NEXT 效果:

在这里插入图片描述

  • actionDone 完成,对应常量EditorInfo.IME_ACTION_DONE 效果:

在这里插入图片描述
JAVA代码:

EditText inputText = (EditText) findViewById(R.id. editTextId);  
inputText.setImeOptions(EditorInfo.IME_ACTION_DONE);

添加监听事件:

inputText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
               
                if (actionId == KeyEvent.ACTION_DOWN || actionId == EditorInfo.IME_ACTION_DONE) {
                // 业务代码
                }
               
                return false;
                // 返回false表示点击后,隐藏软键盘。返回true表示保留软键盘。
            }
        });

需要注意的是setOnEditorActionListener这个方法,并不是在我们点击EditText的时候触发,也不是在我们对EditText进行编辑时触发,而是在我们编辑完之后点击软键盘上的回车键才会触发。

但是,如果手机的输入法不是内置输入法,而是其他第三方输入法,那么可能会发生软件盘回车键无响应的问题。为了防止该类事情,则增加以下方法,响应的其KeyEvent。

inputText.setOnKeyListener(new View.OnKeyListener() {
@Override
  public boolean onKey(View v, int keyCode, KeyEvent event) {
    
 
  if (KeyEvent.KEYCODE_ENTER == keyCode && event.getAction() == KeyEvent.ACTION_DOWN) {
    // 业务代码
    return true;
  }
  return false;
  }
});

false: 抛给系统处理 (将事件放行,焦点会移动)
true: 用户自己处理 (将事件拦截,焦点不会移动)

android 输入类型:

根据要输入的内容展现相应的软件盘,可通过修改android:inputType 来实现,以下是一些常用的输入类型。

android:inputType="none"--输入普通字符
android:inputType="text"--输入普通字符
android:inputType="textCapCharacters"--输入普通字符
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"--时间键盘
密码框属性 android:password="true"   让EditText显示的内容自动为星号,输入时内容会在1秒内变成*字样。

纯数字 android:numeric="true"      让输入法自动变为数字输入键盘,同时仅允许0-9的数字输入

仅允许 android:capitalize="haoTest"   仅允许接受输入haoTest,一般用于密码验证

android:editable="false"         设置EditText不可编辑

android:singleLine="true"        强制输入的内容在单行

android:ellipsize="end"         自动隐藏尾部溢出数据,一般用于文字内容过长一行无法全部显示时

Android 实现EditText输入金额

  1. 设置EditText的InputType

需要将EditText的InputType设置成如下格式,保证用户只能输入小数点和数字:

android:inputType="numberDecimal"

或者

setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL)
  1. 自定义InputFilter,代码如下:

CashInputFilter.java

 import android.text.InputFilter;
import android.text.Spanned;
import android.text.TextUtils;
import android.util.Log;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class CashInputFilter implements InputFilter {

    Pattern mPattern;

    //输入的最大金额
    private static final int MAX_VALUE = Integer.MAX_VALUE;
    //小数点后的位数
    private static final int POINTER_LENGTH = 2;

    private static final String POINTER = ".";

    private static final String ZERO = "0";

    public CashInputFilter() {
        // []匹配括号中的任意一个字符
        // - 在[]内表示字符范围 [0-9]可以匹配一位十进制数,也就是0到9之间的任意一个整数
        // * 紧跟在它前面的单元应匹配0次或者多次
        // ()标记一个子表达式的开始和结束位置,组成一个单元,可以对整个单元使用数量限定符
        // | 链接两个子表达式,表示或的关系
        // \ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("。
        mPattern = Pattern.compile("([0-9]|\\.)*");
    }

    /**
     *
     * 使用source的下标范围[start--end)的内容,替换dest的下标范围是[dstart-dend)的内容。两个区间都是左闭右开 .end-start是本次输入的字数,dend-dstart是本次被替换的字数。
     *
     * 被替换内容是指:当选择输入框里的内容,然后输入新的字符,选择的内容将会被新输入的字符替换。这些选择的内容就是被替换的内容。
     *
     * @param source    新输入的字符串,如果是新增则为新增字符串,如果是删除则为空字符串""
     *
     * @param start     新输入的字符串起始下标(新输入字符串的第一个字符在新字符串中的下标,都是0) 或者 本次输入被选择的起始位置,
     *                  如输入1,起始下标就是0,输入12,起始下标也是0,删除字符相当于输入空字符串"",空字符串的起始下标也是0
     *
     * @param end       新输入的字符串终点下标(新内容的光标终止位置,不包含)或者 本次输入被选择的结束位置(不包含)
     *                  如输入1,终点下标就是1,输入13,终点下标就是2,输入66666,终点下标就是5,删除字符相当于输入空字符串"",空字符串的终点下标是0
     *
     * @param dest      输入之前文本框内容,如果是通过键盘输入,则为输入之前文本框内的内容,如果是通过EditText.setText设置,则dest为空字符串""
     *
     * @param dstart    //被替换内容在输入框中的起始位置,如果是新增,则为新增内容之前光标在输入框中的下标,如果是删除,则为被删除内容在输入框中的起始下标
     *                    如果输入前文本框内是"",输入1,则dstart为0,如果输入前文本框内是"1",输入2,则dstart为1,如果输入前文本框内是"12",删除2,则dstart为1
     *                    如果是通过EditText.setText设置,则 dstart为0
     *                  
     * @param dend      //被替换内容在输入框中的结束位置(不包含),如果是新增,则为新增内容之前光标在输入框中的下标,如果是删除,则为内容被删除前光标在输入框中的下标
     *                
     *                   如果是通过EditText.setText设置,则 dend为0
     *                   
     * @return          输入内容
     *
     * 返回值是你最终想要添加的文本。
     *
     * 如果返回空字符"",则不添加新内容。
     *
     * 如果返回空(null),将本次输入完全添加到输入框中,相当于return source(不建议使用return source)
     *
     * 返回指定有内容的字符串:你希望的输入(如"12345")。次将指定的字符串添加到输入框中(如"12345")
     *
     *  当你在删除已有文本时,source的长度为0。不要以为是错误而过滤这种清空。
     *
     *  不要直接修改dest的内容,它的内容只是用来查看的。
     *
     * */


    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        Log.d("ruanyandong", "filter: source "+source+" start "+start+" end "+end+" dest "+dest+" dstart "+dstart+" dend "+dend);
        String sourceText = source.toString();
        String destText = dest.toString();

        //验证删除等按键
        if (TextUtils.isEmpty(sourceText)) {
            return "";
        }

        Matcher matcher = mPattern.matcher(source);
        //已经输入小数点的情况下,只能输入数字
        if(destText.contains(POINTER)) {
            if (!matcher.matches()) {
                return "";
            } else {
                if (POINTER.equals(source.toString())) {  //只能输入一个小数点
                    return "";
                }
            }

            //验证小数点精度,保证小数点后只能输入两位
            int index = destText.indexOf(POINTER);
            int length = dend - index;

            if (length > POINTER_LENGTH) {
                return dest.subSequence(dstart, dend);
            }
        } else {
            /**
             * 没有输入小数点的情况下,只能输入小数点和数字
             * 1. 首位不能输入小数点
             * 2. 如果首位输入0,则接下来只能输入小数点了
             */
            if (!matcher.matches()) {
                return "";
            } else {
                if ((POINTER.equals(source.toString())) && TextUtils.isEmpty(destText)) {  //首位不能输入小数点
                    return "";
                } else if (!POINTER.equals(source.toString()) && ZERO.equals(destText)) { //如果首位输入0,接下来只能输入小数点
                    return "";
                }
            }
        }

        //验证输入金额的大小
        double sumText = Double.parseDouble(destText + sourceText);
        if (sumText > MAX_VALUE) {
            return dest.subSequence(dstart, dend);
        }

        return dest.subSequence(dstart, dend) + sourceText;
    }


}
  1. CashInputFilter.java 使用方法

在onCreate中写入代码,moneyEditText为输入框

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);

        moneyEditText = (EditText) findViewById(R.id.EditText);
       InputFilter[] filters = {new CashInputFilter()};
        moneyEditText.setFilters(filters);

   }
    

android软键盘的事件响应:android EditText inputType 及 android:imeOptions=”actionDone”
EditText自定义InputFilter完全解析----推荐的监听输入内容的方法
Android 实现EditText输入金额
Android EditText的setOnEditorActionListener方法

;