Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 防止删除EditText中的某些文本_Android - Fatal编程技术网

Android 防止删除EditText中的某些文本

Android 防止删除EditText中的某些文本,android,Android,我希望用户在我在EditText中设置的文本之后输入文本,并且该文本不能被用户删除 例如,我在EditText中设置了文本“Name:”,然后用户在“Name:”之后输入他们的名称。您的做法是错误的 您想要的功能是将文本视图(不可变文本)的行为与编辑文本(可变文本)相结合。您可以通过在EditText上实际放置文本视图来实现这一点 使用相对布局 <EditText android:id="@+id/editText1" android:layout_width="wrap_

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


例如,我在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);
    }
}