1

我希望用户在我已经在 EditText 中设置的文本之后输入文本,并且该文本不能被用户删除。

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

4

2 回答 2

2

您正在以错误的方式处理此问题。

您想要的功能是将TextView(非可变文本)的行为与EditText(可变文本)结合起来。您可以通过将 TextView 放在 EditText 上来做到这一点。

使用相对布局,

<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:" />

这将导致:

在此处输入图像描述

于 2012-12-28T19:52:02.993 回答
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);
    }
}
于 2013-11-25T15:56:29.637 回答