我希望用户输入文本在我在EditText中设置的文本后面,并且用户无法删除此文本。
例如,我在EditText中设置文本“Name:”,然后用户在“Name:”之后输入他们的名字
答案 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:" />
这将导致:
答案 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);
}
}