Edittext.setSelection(content.length());
android:background="@null"
去掉 Edittext 的固定高度,改为 wrap_content,然后使用 padding 值即可
作用
如果我们要进行一些复杂的输入控制(比如:限制单字节多少位;限制只能输入业务要求的特定的字符等)就要用 InputFilter 了
用法
1、创建一个类去 implements InputFilter,实现 filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)
方法
2、在要用到的地方调用 EditText 的 setFilters(InputFilter[] filters)
方法
public abstract CharSequence filter (
CharSequence source, //输入的文字 ,即将输入的字符串
int start, //开始位置 ,source的start
int end, //结束位置 ,source的end,或理解为长度
Spanned dest, //当前显示的内容 ,输入框中原来的内容
int dstart, //当前开始位置,要替换或者添加的起始位置,即光标所在的位置
int dend //当前的结束位置,要替换或者添加的终止始位置,若为选择一串字符串进行更改,则为选中字符串 最后一个字符在dest中的位置
);
import android.text.InputFilter;
import android.text.Spanned;
public class NameInputFilter implements InputFilter {
private int mMaxLen = 16;
public NameInputFilter() {
}
public NameInputFilter(int maxLen) {
this.mMaxLen = maxLen;
}
@Override
public CharSequence filter(CharSequence charSequence, int start, int end, Spanned dest, int dstart, int dend) {
int dindex = 0;
int count = 0; // 判断是否到达最大长度
while (count <= mMaxLen && dindex < dest.length()) {
char c = dest.charAt(dindex++);
if (c < 128) {// 按ASCII码表0-127算
count = count + 1;
} else {
count = count + 2;
}
}
if (count > mMaxLen) {
return dest.subSequence(0, dindex - 1);
}
int sindex = 0;
while (count <= mMaxLen && sindex < charSequence.length()) {
char c = charSequence.charAt(sindex++);
if (c < 128) {
count = count + 1;
} else {
count = count + 2;
}
}
if (count > mMaxLen) {
sindex--;
}
return charSequence.subSequence(0, sindex);
}
}
用法
editText.setFilters(new NameInputFilter[]{new NameInputFilter(8)});// 表示单字节字符最长8位,双字节字符最长4位;根据业务传值
/**
*金额输入过滤器,限制小数点后输入位数
*
* 默认限制小数点2位
* 默认第一位输入小数点时,转换为0.
* 如果起始位置为0,且第二位跟的不是".",则无法后续输入
*/
public class MoneyValueFilter extends DigitsKeyListener {
private static final String TAG = "MoneyValueFilter";
public MoneyValueFilter() {
super(false, true);
}
private int digits = 2;
public MoneyValueFilter setDigits(int d) {
digits = d;
return this;
}
@Override
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
CharSequence out = super.filter(source, start, end, dest, dstart, dend);
Log.d(TAG, "-------source:"+source);
Log.d(TAG, "-------start:"+start);
Log.d(TAG, "-------end:"+end);
Log.d(TAG, "-------dest:"+dest);
Log.d(TAG, "-------dstart:"+dstart);
Log.d(TAG, "-------dend:"+dend);
// if changed, replace the source
if (out != null) {
source = out;
start = 0;
end = out.length();
}
int len = end - start;
// if deleting, source is empty
// and deleting can't break anything
if (len == 0) {
return source;
}
//以点开始的时候,自动在前面添加0
if(source.toString().equals(".") && dstart == 0){
return "0.";
}
//如果起始位置为0,且第二位跟的不是".",则无法后续输入
if(!source.toString().equals(".") && dest.toString().equals("0")){
return "";
}
int dlen = dest.length();
// Find the position of the decimal .
for (int i = 0; i < dstart; i++) {
if (dest.charAt(i) == '.') {
// being here means, that a number has
// been inserted after the dot
// check if the amount of digits is right
return (dlen-(i+1) + len > digits) ?
"" :
new SpannableStringBuilder(source, start, end);
}
}
for (int i = start; i < end; ++i) {
if (source.charAt(i) == '.') {
// being here means, dot has been inserted
// check if the amount of digits is right
if ((dlen-dend) + (end-(i + 1)) > digits)
return "";
else
break; // return new SpannableStringBuilder(source, start, end);
}
}
Log.d(TAG, "-------return:"+new SpannableStringBuilder(source, start, end).toString());
Log.d(TAG, "-----------------------");
// if the dot is after the inserted part,
// nothing can break
return new SpannableStringBuilder(source, start, end);
}
}
用法
xml
<EditText
android:id="@+id/et_inputFilter"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="numberDecimal"/>
代码中
editText.setFilters(new InputFilter[]{new MoneyValueFilter().setDigits(2)});
方法一:
AndroidManifest中相应activity
android:windowSoftInputMode=“stateAlwaysVisible”
方法二:
如果刚进入页面有请求数据操作,如果采用方法一,刚进入页面,软键盘会弹出,请求数据时页面如果不可点击,软键盘会消失,请求数据后,软键盘又会弹出,效果不是很好,可以采用以下方法,在请求完数据后,动态使键盘弹出
/**
* EditText获取焦点并显示软键盘
*/
public static void showSoftInputFromWindow(Activity activity, EditText editText) {
editText.setFocusable(true);
editText.setFocusableInTouchMode(true);
editText.requestFocus();
activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}