设置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 属性,现在还有maxLines和Lines属性可以设置。
然而你会发现,即使同时设置了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输入金额
- 设置EditText的InputType
需要将EditText的InputType设置成如下格式,保证用户只能输入小数点和数字:
android:inputType="numberDecimal"
或者
setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL)
- 自定义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;
}
}
- 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方法