Java Android编辑文本光标位置错误
我尝试在EditText中设置逗号格式。当我尝试从1-9进入时,它工作得非常好。但是如果EditText有一些文本,并且光标不在末尾,并且我尝试输入1-9,它将不按顺序1-9,光标将放置不正确的位置。文本应为“91234567899” 见下面的图片 如何修复它 以下是android calculator的工作原理: 下面是我的代码: 1.activity\u main.xmlJava Android编辑文本光标位置错误,java,android,android-cursor,cursor-position,Java,Android,Android Cursor,Cursor Position,我尝试在EditText中设置逗号格式。当我尝试从1-9进入时,它工作得非常好。但是如果EditText有一些文本,并且光标不在末尾,并且我尝试输入1-9,它将不按顺序1-9,光标将放置不正确的位置。文本应为“91234567899” 见下面的图片 如何修复它 以下是android calculator的工作原理: 下面是我的代码: 1.activity\u main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLay
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.user.test.MainActivity">
<EditText
android:id="@+id/et_number"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#fff"
android:imeOptions="actionDone"
android:inputType="numberDecimal"
android:maxLines="1"
android:maxLength="30"
android:textColor="#000"
android:textSize="17sp"
android:textStyle="bold"
android:singleLine="true"
android:paddingLeft="20dp"
android:digits="0123456789.,"/>
</LinearLayout>
2.MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText editText = (EditText) findViewById(R.id.et_number);
editText.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) {
}
@Override
public void afterTextChanged(Editable s) {
String value = s.toString();
editText.removeTextChangedListener(this);
s.replace(0, value.length(), getDecimalFormattedString(value));
editText.addTextChangedListener(this);
}
});
}
String history;
public String getDecimalFormattedString(String value) {
try {
value = value.replaceAll("," , "");
int dot_amt = 0;
for (int i = 0; i < value.length(); i++){
if ('.' == value.charAt(i)){
dot_amt++;
}
}
if (dot_amt > 1){
return history;
}else {
String str1 = value;
String str2 = "";
if (value.contains(".")){
str1 = value.substring(0, value.indexOf("."));
if ("".equals(str1)){
str1 = "0";
}
str2 = value.substring(value.indexOf("."), value.length());
if (str2.length() > 2){
str2 = str2.substring(0, 3);
}
}
str1 = String.valueOf(Long.parseLong(str1));
String str3 = "";
int i = 0;
for (int k = str1.length()-1; k >= 0 ; k--) {
if (i == 3) {
str3 = "," + str3;
i = 0;
}
str3 = str1.charAt(k) + str3;
i++;
}
history = str3+str2;
}
return history;
}catch (Exception e){
e.printStackTrace();
}
return "";
}
}
public类MainActivity扩展了AppCompatActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
最终编辑文本编辑文本=(编辑文本)findViewById(R.id.et_编号);
editText.addTextChangedListener(新的TextWatcher(){
@凌驾
更改前文本之前的公共void(字符序列s、int start、int count、int after){
}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
}
@凌驾
公共无效后文本已更改(可编辑){
字符串值=s.toString();
removeTextChangedListener(此);
s、 替换(0,value.length(),getDecimalFormattedString(value));
editText.addTextChangedListener(此);
}
});
}
弦历史;
公共字符串getDecimalFormattedString(字符串值){
试一试{
value=value.replaceAll(“,”和“”);
int dot_amt=0;
对于(int i=0;i1){
回归历史;
}否则{
字符串str1=值;
字符串str2=“”;
if(值包含(“.”){
str1=value.substring(0,value.indexOf(“.”);
如果(“.”等于(str1)){
str1=“0”;
}
str2=value.substring(value.indexOf(“.”),value.length();
如果(str2.length()>2){
str2=str2.子串(0,3);
}
}
str1=String.valueOf(Long.parseLong(str1));
字符串str3=“”;
int i=0;
对于(int k=str1.length()-1;k>=0;k--){
如果(i==3){
str3=“,”+str3;
i=0;
}
str3=str1.字符(k)+str3;
i++;
}
历史=str3+str2;
}
回归历史;
}捕获(例外e){
e、 printStackTrace();
}
返回“”;
}
}
只需更改代码,主要思想是在原始值中插入一个“,”后,setSelection(originSelection++)
@Override
public void afterTextChanged(Editable s) {
String value = s.toString();
editText.removeTextChangedListener(this);
String fixedValue = getDecimalFormattedString(value);
int preSelection = editText.getSelectionEnd();
s.replace(0, value.length(), fixedValue);
editText.setSelection(preSelection + fixedValue.length() - value.length());
editText.addTextChangedListener(this);
}
还有一个简单的getDecimalFormattedString
实现,这是一个选项
public String getDecimalFormattedString(String value) {
final int lastIndex = value.length() - 1;
if (!value.contains(".")) {
value = value.replaceAll(",", "");
StringBuilder builder = new StringBuilder(value);
String reverseStr = builder.reverse().toString();
int commaCount = 0;
for (int i = 1; i < reverseStr.length(); i++) {
if (i % 3 == 0) {
builder.insert(commaCount + i, ",");
commaCount++;
}
}
value = builder.reverse().toString();
history = value;//forgot it
} else if (value.charAt(lastIndex) == '.' && value.indexOf('.') != lastIndex) {
value = history;
}
return value;
}
公共字符串getDecimalFormattedString(字符串值){
final int lastIndex=value.length()-1;
如果(!value.contains(“.”){
value=value.replaceAll(“,”和“”);
StringBuilder=新的StringBuilder(值);
字符串reverseStr=builder.reverse().toString();
int commaCount=0;
对于(int i=1;i
就这样,希望它能帮助你 嗯,行得通。但如果尝试输入1-9,EditText empty将崩溃。为什么?谢谢你@AjeetChoudhary@HuoChhunleng异常情况是什么?IndexOutOfBoundsException:当我尝试输入超过3位数字时,setSpan(6…6)结束于长度5之外。@hoochunleng我已经修复了错误,请检查它