按住退格键不会一一清除文本

Posted

技术标签:

【中文标题】按住退格键不会一一清除文本【英文标题】:Hold on backspace doesn't clear text one by one 【发布时间】:2016-10-14 14:13:54 【问题描述】:

我有一个 EditText 实现了 TextWatcher,但 Backspace 键有问题。 前5个字符长按退格时一个一个清除,但转换成图像的后5个字符按退格时不能一个一个清除。

看图:

    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;
    
    
    

    activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_>
    
    <EditText
        android:id="@+id/editText"
        android:layout_
        android:layout_
        android:maxLength="10"
        android:inputType="number" />
    </LinearLayout>
    

【问题讨论】:

@Vickyexpert :我可以通过按退格键一个一个地清除它并一个一个地清除文本,但是当我按住退格键时,文本不会一个一个地清除。 我觉得不是转成icon的原因,因为我用了另一种方法,没有转成icon,也没有用。 那么我认为你需要处理长按退格键,首先做一件事按住另一个键如“1”或“2”并检查它是否工作正常然后检查退格键 @JohnWatsonDev:非常感谢。但是getTextToIcon在底部,你看不到吗? 【参考方案1】:

兄弟,有bug的代码如下:

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

希望对您有所帮助。

【讨论】:

好的。等我测试一下。 它有效。但还不完美。因为当您将光标移动到中间时,光标将始终走到末尾。 是的。你是对的,我现在真的理解你的 setSelection 代码了。感谢您的提示。 我测试了您编辑的代码。它也有效。但是当前5个字符删除后,剩下的后5个字符不转换为数字,它仍然是图标。 @HuoChhunleng 您希望前 5 个字符始终显示为数字吗?【参考方案2】:

现在我从这个链接找到了一个解决方案 https://***.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;
        
    );

【讨论】:

以上是关于按住退格键不会一一清除文本的主要内容,如果未能解决你的问题,请参考以下文章

如何使用jQuery捕获退格键? [复制]

有啥方法可以在运行时屏蔽进入 jText 区域的值,如果一直按下退格键,应该清除内容

前端javascript如何阻止按下退格键页面回退 但 不阻止文本框使用退格键删除文本

Python+Selenium练习篇之12-组合键-退格键删除文字/鼠标右键

如何将加速键赋予键盘退格键

Linux使用退格键时出现^H ^?解决方法