EditText中的永久提示

时间:2011-07-25 17:53:37

标签: android android-edittext

我有一种情况,我希望用户为我完成一个句子。例如,考虑一个带有“我最后一次”提示的EditText。通常,当用户点击EditText时,提示会消失,但我希望保留。另外,我希望文本是永久性的,以便它不能被删除...只留下一个选项...完成句子。

第一部分相当简单,只需使用EditText的setText()方法来放置提示。困难的部分是后者。如何在EditText中找到用户无法删除的文字?

4 个答案:

答案 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建议的预防方法,而不是检查出路。但是如果你以后要验证它,你实际上需要检查返回字符串的开头。