Android 防止删除EditText中的某些文本
我希望用户在我在EditText中设置的文本之后输入文本,并且该文本不能被用户删除Android 防止删除EditText中的某些文本,android,Android,我希望用户在我在EditText中设置的文本之后输入文本,并且该文本不能被用户删除 例如,我在EditText中设置了文本“Name:”,然后用户在“Name:”之后输入他们的名称。您的做法是错误的 您想要的功能是将文本视图(不可变文本)的行为与编辑文本(可变文本)相结合。您可以通过在EditText上实际放置文本视图来实现这一点 使用相对布局 <EditText android:id="@+id/editText1" android:layout_width="wrap_
例如,我在EditText中设置了文本“Name:”,然后用户在“Name:”之后输入他们的名称。您的做法是错误的 您想要的功能是将
文本视图
(不可变文本)的行为与编辑文本
(可变文本)相结合。您可以通过在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:" />
这将导致:
遵循一些基本理念,使用
静态类InnerFieldLabelHelper实现InputFilter、View.OnTouchListener{
私有最终字符序列标签;
私人编辑文本;
InnerFieldLabelHelper(字符序列标签){
this.label=标签;
}
@凌驾
公共CharSequence筛选器(CharSequence源、int开始、int结束、跨区目标、int开始、int结束){
字符序列结果;
if(dest.length()=label.length()-1){
结果=来源;
}否则{
结果=”;
}
如有必要,重置位置();
返回结果;
}
@凌驾
公共布尔onTouch(视图、运动事件、运动事件){
布尔结果=假;
if(view.equals(editText)){
结果=ResetPositionIfEssential();
}
返回结果;
}
公共布尔值resetPositionIfRequired(){
布尔结果=假;
if(editText.length()>=label.length()&&editText.getSelectionStart()
您为什么需要这个?您可能希望使用的方法是将文本视图放在EditText的左侧。我决定将每个EditText的名称放在EditText中。我正在尝试新的方法。你可以为EditText使用文本更改侦听器,如果EditText中的字母数量<例如“Name:”的字母数量,你可以再次设置“Name:”。那会有用的,但这确实是一个黑客行为。@aratn0n可能会帮助你。它并不完全漂亮,但那是因为EditText并不是真的要做你想做的事情。@all:hint不是aratnOn要找的。A-C给出的链接应该能提供您所需的所有信息。@ρцσρρєK引用我自己的回答:“使用相对布局”:-。但是,说真的,这种方法有我没有的缺点吗?我知道你很精通Android开发,所以如果我做了一些愚蠢的事情,请纠正我的做法。:我也支持你的解决方案我们有两种方法来解决当前问题,第一种是使用你的答案,第二种是使用TextWatcher
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);
}
}