0
点赞
收藏
分享

微信扫一扫

Android开发中EditText的使用总结


文章目录

  • ​​Edittext光标移到最后​​
  • ​​隐藏EditText中的下划线​​
  • ​​弹出键盘遮挡一半Edittext解决办法​​
  • ​​字符串过滤器InputFilter使用​​
  • ​​作用和用法​​
  • ​​栗子1:名称输入长度限制​​
  • ​​栗子2:数字最多输入小数点后两位​​
  • ​​EditText获取焦点并显示软键盘​​

Edittext光标移到最后

Edittext.setSelection(content.length());

隐藏EditText中的下划线

android:background="@null"

弹出键盘遮挡一半Edittext解决办法

去掉 Edittext 的固定高度,改为 wrap_content,然后使用 padding 值即可

字符串过滤器InputFilter使用

作用和用法

作用
如果我们要进行一些复杂的输入控制(比如:限制单字节多少位;限制只能输入业务要求的特定的字符等)就要用 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中的位置
);

栗子1:名称输入长度限制

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:数字最多输入小数点后两位

/**
*金额输入过滤器,限制小数点后输入位数
*
* 默认限制小数点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)});

EditText获取焦点并显示软键盘

方法一:
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);
}

举报

相关推荐

0 条评论