2017-09-13 162 views
1

我嘗試在EditText中設置逗號格式。當我嘗試從1-9進入時,它非常完美。但是如果EditText有一些文本並且遊標不在最後,並且我嘗試輸入1-9,它不會以1-9的順序,光標會放置錯誤的位置。文本應該是「91,234,567,899」Android EditText光標錯誤位置

查看圖像波紋管。

如何解決?

CorrectIncorrect

這是Android的計算器是如何工作的:

Android Calculator

下面是我的代碼:

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

回答

1

只要改變你的代碼一樣,其主要思想是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; 
} 

就是這樣,希望它可以幫你!

+0

Emmm,它的工作原理。但如果嘗試輸入1-9時EditText爲空將粉碎。爲什麼? –

+0

謝謝@Ajeet Choudhary – JavaNoob

+0

@霍春倫什麼是例外? – JavaNoob