2017-09-13 6 views
1

Ich versuche, Komma-Format in EditText festzulegen. Es funktioniert perfekt, wenn ich versuche, von 1-9 einzugeben. Aber wenn der EditText etwas Text hat und der Cursor nicht am Ende ist, und ich versuche, 1-9 einzugeben, wird es nicht in der Reihenfolge 1-9, der Cursor wird falsche Position platzieren. Der Text sollte "91,234,567,899"Android EditText Cursor falsche Position

sein Siehe die Bilder unten.

Wie es zu beheben?

CorrectIncorrect

Dies ist, wie Android-Rechner gearbeitet:

Android Calculator

Unten ist mein Code:

1.activity_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=".,"/> 
</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 ""; 
} 
} 

Antwort

1

einfach Ihren Code ändern, wie die Hauptidee ist setSelection(originSelection++), nachdem Sie ein einfügen '' in ursprünglichen Wert

 @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); 
     } 

und eine einfache Umsetzung von getDecimalFormattedString, ist dies eine Option

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; 
} 

, die es ist, will es könnte dir helfen!

+0

Emm, es funktioniert. Aber wenn Sie versuchen, 1-9 einzugeben, wenn EditText leer ist, wird es zerquetscht. Warum? –

+0

Danke @Ajeet Choudhary – JavaNoob

+0

@HuoChhunleng Was war die Ausnahme? – JavaNoob

Verwandte Themen