我希望用户在我已经在 EditText 中设置的文本之后输入文本,并且该文本不能被用户删除。
例如,我在 EditText 中设置文本“名称:”,然后用户在“名称:”之后输入他们的名称
我希望用户在我已经在 EditText 中设置的文本之后输入文本,并且该文本不能被用户删除。
例如,我在 EditText 中设置文本“名称:”,然后用户在“名称:”之后输入他们的名称
您正在以错误的方式处理此问题。
您想要的功能是将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:" />
这将导致:
遵循一些基本思想,使用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);
}
}