使用: android:textColorHint="@drawable/edittext_hintcolor_selector"
去指定: 那么,咱们的XML文件以下:php
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="false" android:color="#8d9fa8"/>
<item android:state_focused="true" android:color="#00cbfe"/>
</selector>
复制代码
使用: android:background="@drawable/edit_msg_dialog_bg"
去替换: 这里给出一个例子:html
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:drawable="@drawable/line_et_focus"/>
<item android:drawable="@drawable/line_et_normal"/>
</selector>
复制代码
上面的bg指定了Focused的时候的样式:java
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@android:color/transparent" />
</shape>
</item>
<item android:left="-2dip" android:right="-2dip" android:top="-2dip">
<shape>
<solid android:color="@android:color/transparent" />
<stroke android:width="1dip" android:color="@android:color/holo_green_light" android:dashGap="0dp" android:dashWidth="0dip" />
</shape>
</item>
</layer-list>
复制代码
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@android:color/transparent" />
</shape>
</item>
<item android:left="-2dip" android:right="-2dip" android:top="-2dip">
<shape>
<solid android:color="@android:color/transparent" />
<stroke android:width="1dip" android:color="#cecece" android:dashGap="0dp" android:dashWidth="0dip" />
</shape>
</item>
</layer-list>
复制代码
使用TextWatcher监听EditText变化android
/** * 监听EditText框中的变化 */
mEditText.addTextChangedListener(new TextWatcher() {
private CharSequence temp;
private int editStart;
private int editEnd;
/** * 在字符串s内,从索引为start(包含)的字符开始的count个字 * 符将被长度为after的新文本代替 * @param s * @param start * @param count * @param after */
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
temp = s;
}
/** * 在字符串s内,从索引为start(包含)的字符开始count个字符 * 刚刚替换了长度为before的旧字符 * @param s * @param start * @param before * @param count */
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mTextView.setText("输入的结果为:"+s);
}
/** * 字符串s内容已经发生了变化.能够在这一步对s进行合理的变动,可是要注意不要进入 *无限循环,由于字符串的任何变化都会再次递归调用此回调方法.在这个方法中不会告 * 诉 你字符串哪些内容发生了变化,由于其余针对字符串的改变已经调用了 * afterTextChanged().若是你想知道哪些发生了变化,能够在 * onTextChanged(CharSequence, int, int, int)使用setSpan(Object, int, int, int) * @param s */
@Override
public void afterTextChanged(Editable s) {
editStart = mEditText.getSelectionStart();
editEnd = mEditText.getSelectionEnd();
if (temp.length() > 10) {//限制长度
Toast.makeText(MainActivity.this,"输入的字数已经超过了限制!",
Toast.LENGTH_SHORT).show();
s.delete(editStart - 1, editEnd);
int tempSelection = editStart;
mEditText.setText(s);
mEditText.setSelection(tempSelection);
}
}
});
复制代码
Android中Activity中某个EditText被clearFocus后其余控件(别的EditText)也不要得到焦点github
一样的问题:Android中Activity中某个EditText被clearFocus后其余控件(别的EditText),会自动获取到焦点,此时也能够用如下的方法解决。在布局的最外层,顶级父布局中,设置:数组
android:focusable="true"
android:focusableInTouchMode="true"
复制代码
这样,就把EditText默认的行为截断了!在未点击Edittext前,EditText不会显示光标bash
EditText et = (EditText)findViewById(R.id.inbox);
et.setSelection(et.getText().length());
复制代码
如何限制只能输入指定的字符
设置 android:digits 属性便可
android:digits = "abcdef"
限制只能输入:abcdef
android:digits="1234567890"
限制只能输入数字
复制代码
这里以手机号为例,每使用空格分隔成,3,4,4的样子,相似:130 1234 5678
的样子,手机号码为11位,可是由于有特殊字符(代码中将空格替换为想要的字符)或者空格,因此EditText的 android:maxLength="13"
属性要设置为大于11,个人因为存在两个空格,因此设置最大为13。ide
android:digits="1234567890"<!--只容许输入这10个数字-->
复制代码
private boolean flagIsDeletePhoneEt = false;
etPhone.addTextChangedListener(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) {
int length = s.toString().length();
//删除数字
if (count == 0) {
flagIsDeletePhoneEt = true;
}
//添加数字
if (count == 1) {
if (length == 4) {
String part1 = s.subSequence(0, 3).toString();
String part2 = s.subSequence(3, length).toString();
etPhone.setText(part1 + " " + part2);
}
if (length==9){
String part1 = s.subSequence(0, 8).toString();
String part2 = s.subSequence(8, length).toString();
etPhone.setText(part1 + " " + part2);
}
flagIsDeletePhoneEt = false;
}
}
@Override
public void afterTextChanged(Editable s) {
//将光标移动到末尾
if (!flagIsDeletePhoneEt)
etPhone.setSelection(etPhone.getText().toString().length());
checkIsFullWrite(btnLogin,etPhone,etVerificationCode);
}
});
复制代码
虽然效果作出来了,可是当咱们调用etPhone.getText().toString()方法时, 你会发现获得的结果里也是包含空格或者特殊字符的一串号码。若是想要纯 数字的结果,那么就须要对结果进行一下处理:工具
//从EditText获取的字符串
String phoneNum=etPhone.getText().toString();
//纯数字字符串
String number=formatPhoneNum(phoneNum);
/** * 去掉手机号内除数字外的全部字符 * * @param phoneNum 手机号 * @return */
private String formatPhoneNum(String phoneNum) {
String regex = "(\\+86)|[^0-9]";
Pattern pattern = Pattern.compile(regex );
Matcher matcher = pattern.matcher(phoneNum);
return matcher.replaceAll("");
}
复制代码
思路:在Activity的事件分发方法中去判断,当前的焦点是否在Et上,若是是,则清除焦点和关闭软盘。
/**
* 清除editText的焦点
* @param views views
*/
public void clearViewFocus(View v, View[] views) {
if (null != views && views.length > 0) {
for (View view : views) {
if (v==view) {
view.clearFocus();
return;
}
}
}
}
/**
* 是否焦点在Et上
*
* @param v 焦点所在View
* @param views 输入框
* @return true表明焦点在edit上
*/
public boolean isFocusEditText(View v, View[] views) {
if (v instanceof EditText) {
EditText et = (EditText) v;
for (View view : views) {
if (et.getId() == view.getId()) {
return true;
}
}
}
return false;
}
/**
* 判断触摸点,是否在过滤控件上
* @param views views
* @param ev ev
* @return true / false
*/
public boolean isTouchView(View[] views, MotionEvent ev) {
if (views == null || views.length == 0) {
return false;
}
int[] location = new int[2];
for (View view : views) {
view.getLocationOnScreen(location);
int x = location[0];
int y = location[1];
if (ev.getX() > x && ev.getX() < (x + view.getWidth())
&& ev.getY() > y && ev.getY() < (y + view.getHeight())) {
return true;
}
}
return false;
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
//1. 判断是不是点击了,过滤的控件
if (isTouchView(filterViewByIds(), ev)) {
return super.dispatchTouchEvent(ev);
}
//2. 若是 et 为空,则返回
View[] views = hideSoftByEditViewIds();
if (views == null || views.length == 0) {
return super.dispatchTouchEvent(ev);
}
//3. 判断是不是是再次点击了 et 控件
if (isTouchView(views, ev)) {
return super.dispatchTouchEvent(ev);
}
//4. 获取到当前焦点的View,而后,判断是否 view 是不是 et 中的一个,
// 如果,就清除焦点,关掉软盘
View v = getCurrentFocus();
if (isFocusEditText(v, views)) {
clearViewFocus(v, views);
closeKeyboard(this, v);
}
}
return super.dispatchTouchEvent(ev);
}
public void closeKeyboard(Context context, View v) {
InputMethodManager imm = (InputMethodManager)
context.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(v.getWindowToken(),0);
}
}
/**
* 传入EditText的Id
* 没有传入的EditText不作处理
*
* @return id 数组
*/
public View[] hideSoftByEditViewIds() {
return new View[] { et1, et2 };
}
/**
* 传入要过滤的View
* 过滤以后点击将不会有隐藏软键盘的操做
*
* @return id 数组
*/
public View[] filterViewByIds() {
return new View[] { et1, et2, btn};
}
复制代码
注意的是,若是当前的Activity中有多个Et,那么,清除其中一个Et后,别的Etd(布局中的第一个)会自动获取到焦点,其解决方法参考第4点。封装的工具类
后面经过监听软键盘的高度进行解决。网上还有这个解决,为验证:【Android】EditText 遇到软键盘遮挡底部一点的问题