Create Extended ASCII Character InputFilter
<p>I'm using the below InputFilter to filter out invalid (ASCII with decimal value above 127) and the EditText displays the text twice when an invalid character is entered.  I do want the EditText to show the valid characters, below is an example of what happens.</p>

<p>-user enters <strong>XYZ€</strong> in the EditText component<br>
-toast message appears on the screen stating "Invalid non-Ascii Character"<br>
-EditText component shows xyz on the screen which is what I expected<br>
-user enters a valid character, <strong>A</strong> so the screen shows <strong>XYZA</strong><br>
-InputFilter runs and returns <strong>XYZA</strong> but <strong>XYZXYZA</strong> appears in the EditText component which is not correct.  Its duplicating the <strong>XYZ</strong><br></p>

<p>Any ideas on why its duplicating the entered text after processing an invalid character?</p>

<p><strong>Screen:</strong></p>

<pre><code>&lt;EditText android:id="@+id/editText"
    android:layout_width="fill_parent" android:layout_height="120dp"
    android:layout_marginTop="10dp" android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp" android:maxLength="45"
    android:focusable="true" android:inputType="text"
    android:cursorVisible="true" android:imeOptions="actionDone"
 /&gt;
</code></pre>

<p><strong>Activity:</strong>   </p>

<pre><code>public class EditTextActivity extends Activity {        

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        EditText eText = (EditText) findViewById(R.id.editText);
        setAsciiTextFilter();
    }    

    private void setAsciiTextFilter() {

              InputFilter filter = new InputFilter() {

                    int asciiNo;

                    @Override
                    public CharSequence filter(CharSequence source, int start, int end,
                            Spanned dest, int dstart, int dend) {

                        for (int i = start; i &lt; end; i++) {

                            asciiNo = source.charAt(i);

                            if(asciiNo &gt; 127) {       

                                toast = mUtility.showToast("Invalid non-Ascii Character", Toast.LENGTH_SHORT);

                                //Replace the invalid ascii character with empty String
                                return source.toString().replace(source.charAt(i)+"", "");
                            }    
                        }
                        return null;
                    }
                };


           eText.setFilters(new InputFilter[]{filter}); 
    }
}
</code></pre>

<p><strong>New Attempt:</strong></p>

<pre><code> InputFilter filter = new InputFilter() {
                        @Override
                        public CharSequence filter(CharSequence source, int start, int end,
                                Spanned dest, int dstart, int dend) {

                            if (source instanceof SpannableStringBuilder) {
                                SpannableStringBuilder sourceAsSpannableBuilder = (SpannableStringBuilder)source;
                                for (int i = end - 1; i &gt;= start; i--) { 
                                    char currentChar = source.charAt(i);
                                    int ascii = currentChar;
                                     if (ascii &gt; 127) {    
                                         sourceAsSpannableBuilder.delete(i, i+1);
                                         toast = mUtility.showToast("Invalid non-Ascii Character", Toast.LENGTH_SHORT);
                                     }     
                                }
                                return source;
                            } else {
                                StringBuilder filteredStringBuilder = new StringBuilder();
                                for (int i = 0; i &lt; end; i++) { 
                                    char currentChar = source.charAt(i);
                                    int ascii = currentChar;
                                    if (ascii &lt;= 127) {    
                                        filteredStringBuilder.append(currentChar);
                                    }     
                                }
                                return filteredStringBuilder.toString();
                            }
                        }
                    };
</code></pre>
