按住退格键不会一一清除文本
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;
);
【讨论】:
以上是关于按住退格键不会一一清除文本的主要内容,如果未能解决你的问题,请参考以下文章
有啥方法可以在运行时屏蔽进入 jText 区域的值,如果一直按下退格键,应该清除内容
前端javascript如何阻止按下退格键页面回退 但 不阻止文本框使用退格键删除文本