我有一种情况,我希望用户为我完成一个句子。例如,考虑一个带有“我最后一次”提示的EditText
。通常,当用户点击EditText
时,提示会消失,但我希望保留。另外,我希望文本是永久性的,以便它不能被删除...只留下一个选项...完成句子。
第一部分相当简单,只需使用EditText的setText()
方法来放置提示。困难的部分是后者。如何在EditText
中找到用户无法删除的文字?
答案 0 :(得分:2)
你能不能在代码中做到这一点?一些算法,如果文本少于16个字符(“我最后一次”的长度),则将文本设置为该字符。因此,只要他们点击它,如果他们试图删除它,它就会回到默认文本。
另外,另外一个想法..你为什么不制作一个TextView,右边缘与EditText框的左边缘对齐,用户永远不会知道它是另一个盒子。这是最好的解决方案,如果您不想编辑文本,只需将其设为TextView
答案 1 :(得分:2)
使用android.text.TextWatcher
可以解决所描述的问题。
public class CompleteSentenceWathcher implements TextWatcher {
private final String initialText;
private int start;
private int after;
private int count;
public CompleteSentenceWathcher(String initialText) {
this.initialText = initialText;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
this.start = start;
this.count = count;
this.after = after;
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if(start < initialText.length()) {
if(s.toString().startsWith(initialText)) {
return;
}
if(count >= 1 && after == 0) {
if(start+count+1 <= initialText.length()) {
s.replace(start, start+count, initialText.substring(start, start+count+1));
} else {
s.replace(start, start, initialText.substring(start, start+1));
}
} else if(count == 0 && after >= 1) {
s.delete(start, start+after);
}
}
}
}
创建EditText的实例并添加TextWatcher。
EditText editText = new EditText(this);
editText.setText("I love");
editText.addTextChangedListener(new CompleteSentenceWathcher(editText.getText().toString()));
答案 2 :(得分:2)
我已使用InputFilter
实现此功能,其中_PERMANENT_HINT_TEXT
是我不希望用户修改的EditText
末尾的文本。我建议为它添加一个颜色范围,以便它显示为灰色,希望看起来像文本的提示/禁用部分。这应该有希望改善用户体验,因为他们应该自动认为它是不可修改的,并且不仅仅想知道为什么EditText
的某些部分(它们通常可以完全改变)不“正常”。此方法允许在之后设置文本
InputFilter
上设置了EditText
,因为我在EditTextPreference
上使用了EditText
,这是我的要求。
要清楚,我需要永久文本存在于new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int source_start, int source_end,
Spanned destination, int destination_start, int destination_end) {
final int protected_text_start = (TextUtils.isEmpty(destination)? source.length() : destination.length()) - _PERMANENT_HINT_TEXT.length();
// Allows input into unprotected region
if (source_start + destination_start - source_end < protected_text_start)
return null;
// Prevents deletion of protected region
else if (TextUtils.isEmpty(source))
return destination.subSequence(destination_start, destination_end);
// Ignores insertion into protected region
else
return "";
}
}
的末尾,而不是开头,但这应该与我的实现对称。
EditText.setFilters(new InputFilters[] { /* InputFilter goes here */ };
使用EditText
将其添加到所需的{{1}}。
答案 3 :(得分:0)
只是检查长度是不够的...我可以输入“这是一个非常长的文本我放入框中”它会接受它,即使它不是以“我最后一次开始“字符串。
就个人而言,我可能会选择使用TextView建议的预防方法,而不是检查出路。但是如果你以后要验证它,你实际上需要检查返回字符串的开头。