Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android编辑文本光标位置错误_Java_Android_Android Cursor_Cursor Position - Fatal编程技术网

Java Android编辑文本光标位置错误

Java 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

我尝试在EditText中设置逗号格式。当我尝试从1-9进入时,它工作得非常好。但是如果EditText有一些文本,并且光标不在末尾,并且我尝试输入1-9,它将不按顺序1-9,光标将放置不正确的位置。文本应为“91234567899”

见下面的图片

如何修复它

以下是android calculator的工作原理:

下面是我的代码:

1.activity\u main.xml

<?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我已经修复了错误,请检查它