2016-06-14 1 views
3

私はEditTextにTextWatcherを実装していますが、Backspaceキーに問題があります。 バックスペースを保持すると、最初の5文字は1つずつクリアされますが、バックスペースを保持すると、イメージに変換された最後の5文字は1つずつクリアできません。バックスペースを保持するとテキストが1つずつクリアされない

は画像を見て:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<EditText 
    android:id="@+id/editText" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:maxLength="10" 
    android:inputType="number" /> 
</LinearLayout> 
activity_main.xml

enter image description here

  1. MainActivity.java

    public class MainActivity extends AppCompatActivity { 
    Spannable.Factory spannableFactory; 
    
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    spannableFactory = Spannable.Factory 
         .getInstance(); 
    
    final EditText editText = (EditText) findViewById(R.id.editText); 
    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) { 
         editText.removeTextChangedListener(this); 
         if (s.length() >= 5) { 
          editText.setText(getTextToIcon(getApplicationContext(), s)); 
         } 
         if(count!=0){        // != key delete 
          if (s.length() - 1 > start) { 
           editText.setSelection(start + 1); 
          } else { 
           editText.setSelection(s.length()); 
          } 
         }else{          // = key delete 
          editText.setSelection(start); 
         } 
    
         editText.addTextChangedListener(this); 
        } 
    
        @Override 
        public void afterTextChanged(Editable s) {} 
    }); 
    } 
    
    
    public Spannable getTextToIcon(Context context, CharSequence text) { 
    StringBuilder stringBuilder = new StringBuilder(text); 
    Spannable spannable = spannableFactory.newSpannable(stringBuilder); 
    int index = text.length() - 1; 
    for(int i = 5; i<=index; i++){ 
        spannable.setSpan(new ImageSpan(context, android.R.drawable.star_on), 
          i, i + 1, 
          Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
    } 
    return spannable; 
    } 
    } 
    
+0

テキストをアイコンに変換するので、それをバックスペースで消去することはできません。アイコンを消去してバックスペース上のアイコンからテキストに戻して変換する必要があります。 – Vickyexpert

+0

@Vickyexpert:バックスペースを1つずつ押してクリアテキストを1つずつクリアすることができますが、バックスペースを保持すると1つずつクリアされません。 –

+0

私はそれがアイコンに変換するためではないと思う、私はアイコンに変換していない別の方法を使用するため、それも動作しません。 –

答えて

0

今、私はこのリンクから解決策を見つけました。 https://stackoverflow.com/a/10954719/5887320 他にも役立つことを願っています。

editText.addTextChangedListener(new TextWatcher() { 
     boolean isEdiging; 
     @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } 
     @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } 

     @Override public void afterTextChanged(Editable s) { 
      if(isEdiging) return; 
      isEdiging = true; 

      String str = s.toString().replaceAll("[^\\d]", ""); 
      double s1 = 0; 
      try { 
       s1 = Double.parseDouble(str); 
      }catch (NumberFormatException e){ 
       e.printStackTrace(); 
      } 


      NumberFormat nf2 = NumberFormat.getInstance(Locale.ENGLISH); 
      ((DecimalFormat)nf2).applyPattern("###,###.###"); 
      s.replace(0, s.length(), nf2.format(s1)); 

      isEdiging = false; 
     } 
    }); 
} 
4

ブロ、バグとのコードは以下の通りです:

if (s.length() >= 5) { 
    editText.setText(getTextToIcon(getApplicationContext(), s)); 
} 

あなたはこれにそれを変更する必要があります

if (count != 0 && s.length() >= 5) { 
    // just set the text to the icon in input state instead of pressing delete key in soft method 
    editText.setText(getTextToIcon(getApplicationContext(), s)); 
} 

はそれが役立つ願っています。

+0

私はそれを試して待ってください。 –

+0

それは動作します。まだ完璧ではありません。カーソルが中央に移動すると、カーソルは常に最後に移動します。 –

+0

あなたは正しいです、そして、私はあなたのsetSelectionコードを本当に理解しています。ヒントをありがとう。 – JohnWatsonDev

関連する問題