版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】怎么在Android中使用EditText追加空格
今天就跟大家聊聊有关怎么在Android中使用EditText追加空格,可能很多人都不太了解,为了让大家更加了解,在下给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。追加字符借鉴博客EditText每4位自动添加空格import
android.content.Context;
import
android.text.Editable;
import
android.text.TextUtils;
import
android.text.TextWatcher;
import
android.util.AttributeSet;
import
com.ifreegroup.ebbly.lib_common.utils.AppLogUtil;
/**
*
@Describe:自动添加占位符的输入框
*/
public
class
PlaceHolderEditText
extends
android.support.v7.widget.AppCompatEditText
{
//上次输入框中的内容
private
String
lastString;
//光标的位置
private
int
selectPosition;
//输入框内容改变监听
private
TextChangeListener
listener;
//追加字符
private
String
item
=
"-";
public
PlaceHolderEditText(Context
context)
{
super(context);
initView();
}
public
PlaceHolderEditText(Context
context,
AttributeSet
attrs)
{
super(context,
attrs);
initView();
}
public
PlaceHolderEditText(Context
context,
AttributeSet
attrs,
int
defStyleAttr)
{
super(context,
attrs,
defStyleAttr);
initView();
}
private
void
initView()
{
addTextChangedListener(new
TextWatcher()
{
@Override
public
void
beforeTextChanged(CharSequence
s,
int
start,
int
count,
int
after)
{
}
/**
*
当输入框内容改变时的回调
*
@param
s
改变后的字符串
*
@param
start
改变之后的光标下标
*
@param
before
删除了多少个字符
*
@param
count
添加了多少个字符
*/
@Override
public
void
onTextChanged(CharSequence
s,
int
start,
int
before,
int
count)
{
//因为重新排序之后setText的存在
//会导致输入框的内容从0开始输入,这里是为了避免这种情况产生一系列问题
if
(start
==
0
&&
count
>
1
&&
getSelectionStart()
==
0)
{
return;
}
String
textTrim
=
getText().toString().trim();
if
(TextUtils.isEmpty(textTrim))
{
return;
}
//如果
before
>0
&&
count
==
0,代表此次操作是删除操作
if
(before
>
0
&&
count
==
0)
{
selectPosition
=
start;
if
(TextUtils.isEmpty(lastString))
{
return;
}
//将上次的字符串去空格
和
改变之后的字符串去空格
进行比较
//如果一致,代表本次操作删除的是空格
if
(textTrim.equals(lastString.replaceAll(item,
"")))
{
//帮助用户删除该删除的字符,而不是空格
StringBuilder
stringBuilder
=
new
StringBuilder(lastString);
stringBuilder.deleteCharAt(start
-
1);
selectPosition
=
start
-
1;
setText(stringBuilder.toString());
}
}
else
{
//此处代表是添加操作
//当光标位于空格之前,添加字符时,需要让光标跳过空格,再按照之前的逻辑计算光标位置
if
((start
+
count)
%
5
==
0)
{
selectPosition
=
start
+
count
+
1;
}
else
{
selectPosition
=
start
+
count;
}
}
}
@Override
public
void
afterTextChanged(Editable
s)
{
//获取输入框中的内容,不可以去空格
String
etContent
=
getText().toString();
if
(TextUtils.isEmpty(etContent))
{
if
(listener
!=
null)
{
listener.textChange("");
}
return;
}
//重新拼接字符串
String
newContent
=
addSpaceByCredit(etContent);
//保存本次字符串数据
lastString
=
newContent;
//如果有改变,则重新填充
//防止EditText无限setText()产生死循环
if
(!newContent.equals(etContent))
{
setText(newContent);
try
{
//保证光标的位置
setSelection(selectPosition
>
newContent.length()
?
newContent.length()
:
selectPosition);
}
catch
(Exception
e)
{
//刚好为限制字符的整数倍时添加空格后会出现越界的情况
//AppLogUtil.e("超过限制字符");
}
}
//触发回调内容
if
(listener
!=
null)
{
listener.textChange(newContent);
}
}
});
}
/**
*
输入框内容回调,当输入框内容改变时会触发
*/
public
interface
TextChangeListener
{
void
textChange(String
text);
}
public
void
setTextChangeListener(TextChangeListener
listener)
{
this.listener
=
listener;
}
/**
*
每4位添加一个空格
*
*
@param
content
*
@return
*/
public
String
addSpaceByCredit(String
content)
{
if
(TextUtils.isEmpty(content))
{
return
"";
}
content
=
content.replaceAll(item,
"");
if
(TextUtils.isEmpty(content))
{
return
"";
}
StringBuilder
newString
=
new
StringBuilder();
for
(int
i
=
1;
i
<=
content.length();
i++)
{
if
(i
%
4
==
0
&&
i
!=
content.length())
{
newString.append(content.charAt(i
-
1)
+
item);
}
else
{
newString.append(content.charAt(i
-
1));
}
}
return
newString.toString();
}
/**
*
获取追加字符前输入内容
*
@return
*/
public
String
getInputText()
{
return
getText().toString().replaceAll(item,
"");
}
} 核心思路是在文本改变时获取到原字符串取出每一个字符添加上要追加的字符后返回字符串并重新setText。当然中间会有一些坑,比如光标位置、删除时空格要跳过以及删除后会再追加空格会造成死循环的问题。当然这里很多情况已经处理过了,如果有其他需求比如手机号码的11111111111的形式可以修改addSpaceByCredit这个方法。限制字符借鉴博客AndroidEditText限制输入字符的5种实现方式
et_traveler_content.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)
{
String
editable
=
et_traveler_content.getText().toString();
String
str
=
stringFilter(editable.toString());
if
(!editable.equals(str))
{
et_traveler_content.setText(str);
//设置新的光标所在位置
et_traveler_content.setSelection(et_traveler_content.getText().toString().length());
}
}
@Override
public
void
afterTextChanged(Editable
s)
{
}
});
public
String
stringFilter(String
str)
{
//
只允许字母、数字、英文空白字符
String
regEx
=
"[^a-zA-Z0-9\\s]";
Pattern
p
=
Ppile(regEx);
Matcher
m
=
p.matcher(str);
return
m.replaceAll("");
} 这里也是输入时做过滤然后重新setText。只要需要对正则表达式熟悉想做什么限制都可以。MD效果系统自带
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="15dp"
android:padding="0dp"
android:layout_centerVertical="true"
android:gravity="center_vertical">
<EditText
……
/>
</android.support.design.widget.TextInputLayout>只需要用TextInputLayout包裹一层便可以实现MD效果。常用属性1.明文、密文
if
(isShowPwd)
{
/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年高效蒸汽管网设备项目建议书
- 2024年LNG加气站设备项目发展计划
- 2024-2030年全球及中国六甲撑二异氰酸酯行业应用态势及供需前景预测报告
- 2024-2030年全球及中国YVO4晶体行业应用趋势与投资效益预测报告
- 2024-2030年全球与中国高纯异丁烯行业供需态势与投资前景预测报告
- 2024-2030年全球与中国百里香酚晶体行业需求态势及前景动态预测报告
- 2024-2030年全球与中国学校家具行业销售状况及竞争态势分析报告
- 2024-2030年免疫组织化学行业市场现状供需分析及重点企业投资评估规划分析研究报告
- 2024-2030年光电图像器件市场发展分析及行业投资战略研究报告
- 2024-2030年儿童家具行业市场发展分析及前景趋势与投资研究报告
- 医疗美容诊所规章制度范本
- 石蜡疗法教学课件
- 树立正确“三观”班会课件
- 2024届江苏省南通市通州海安高考语文五模试卷含解析
- 邛海湿地公园
- 汽车尾气净化解决方案
- 社区安全用电科普知识讲座
- 仓储物流风险分析与应对措施
- 开放心灵成就辉煌梦想主题班会课件
- 消化系统疾病介入治疗
- 安保外包服务项目服务方案
评论
0/150
提交评论