防止在EditText中删除一些文本

时间:2012-12-28 19:35:03

标签: android

我希望用户输入文本在我在EditText中设置的文本后面,并且用户无法删除此文本。

例如,我在EditText中设置文本“Name:”,然后用户在“Name:”之后输入他们的名字

2 个答案:

答案 0 :(得分:2)

你正以错误的方式接近这一点。

您想要的功能是将TextView(不可变文本)的行为与EditText(可变文本)结合起来。你可以通过在EditText 上实际放置TextView来实现这一点。

使用相对布局

<EditText
    android:id="@+id/editText1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="43dp"
    android:paddingLeft="54dp"
    android:ems="10" >

    <requestFocus />
</EditText>

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="8dp"
    android:layout_alignLeft="@+id/editText1"
    android:layout_alignBaseline="@+id/editText1"
    android:text="Name:" />

这将导致:

enter image description here

答案 1 :(得分:1)

使用InputFilter遵循一些基本想法。

static class InnerFieldLabelHelper implements InputFilter, View.OnTouchListener {

    private final CharSequence label;
    private EditText editText;

    InnerFieldLabelHelper(CharSequence label) {
        this.label = label;
    }

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

        CharSequence result;
        if (dest.length() < label.length()) {
            result = label.subSequence(label.length() - 2, label.length());
        } else if (dstart >= label.length() - 1) {
            result = source;
        } else {
            result = "";
        }

        resetPositionIfNecessary();

        return result;
    }

    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        boolean result = false;
        if (view.equals(editText)) {
            result = resetPositionIfNecessary();
        }
        return result;
    }

    public boolean resetPositionIfNecessary() {
        boolean result = false;
        if (editText.length() >= label.length() && editText.getSelectionStart() < label.length()) {
            editText.setSelection(label.length());
            editText.requestFocus();
            result = true;
        }
        return result;
    }

    public void configure(EditText editText) {
        this.editText = editText;
        this.editText.setText(label);
        this.editText.setSelection(label.length());

        this.editText.setFilters(new InputFilter[]{ this });
        this.editText.setOnTouchListener(this);
    }
}