如何避免在编辑文本中编辑特定字符

时间:2020-10-28 13:24:17

标签: java android kotlin android-edittext

我有一个像这样的字符串08:12:01,868-> hour:minute:second,millisecond

现在我需要进行编辑,我必须提供一个选项来编辑:的前两个字符跳过一个,然后再次允许编辑下两个字符的跳过:,依此类推。

目前,我在实现这一目标的同时还具有很多逻辑。我有四个编辑文本,然后拆分字符串,然后在4个编辑文本中加载值并进行检索。加入所有已编辑的子字符串后,我将该值保存在DB中。

还有其他更好的方法可以实现这一目标。

我的意思是只将字符串加载到一个编辑文本中,然后我应该能够锁定诸如lockFromEditChar(":",",")之类的特定字符,并且如果清除了所有字符,则可以使用默认值零来编辑其余值。 / p>

有可能吗?或其他最佳选择?

2 个答案:

答案 0 :(得分:4)

该技术称为“遮罩”。像这样创建此类MaskWatcher

import android.text.Editable;
import android.text.TextWatcher;

public class MaskWatcher implements TextWatcher {
    private boolean isRunning = false;
    private boolean isDeleting = false;
    private final String mask;

    public MaskWatcher(String mask) {
        this.mask = mask;
    }

    @Override
    public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
        isDeleting = count > after;
    }

    @Override
    public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
    }

    @Override
    public void afterTextChanged(Editable editable) {
        if (isRunning || isDeleting) {
            return;
        }
        isRunning = true;

        int editableLength = editable.length();
        if (editableLength < mask.length()) {
            if (mask.charAt(editableLength) != '#') {
                editable.append(mask.charAt(editableLength));
            } else if (mask.charAt(editableLength-1) != '#') {
                editable.insert(editableLength-1, mask, editableLength-1, editableLength);
            }
        }

        isRunning = false;
    }
}

,然后像这样使用您的编辑文本

editText.addTextChangedListener(MaskWatcher("##:##:##,###"));

答案 1 :(得分:0)

如果光标停留在最后一个位置并且禁用longClick(复制粘贴):

请注意,此示例仅适用于字符串,不适用跨度

创建TextWatcher并自动添加:和,当您检测到添加的新字符并且新大小为2,4(for':'),6(for',')。

还要检测何时删除字符,并且当前大小为2,4,6,则必须删除';'之前的字符。或“,”。

class Watcher(private val textView:TextView) : TextWatcher {

    override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
         val text = s?.toString()?:""
         val isDelete = textView.length > text.size
         if(isDelete) {
              //you can change this to an if to check for 2,4,6 and use take(size-1)
              newString = when(text.size) {
                  2->text.take(1)
                  4->text.take(3)
                  6->text.take(5)
              }
              if(newString!=null) {
                  textView.text = newString
              }
         } else {
              newString = when(text.size) {
                  2,4 -> text + ":"
                  6 -> text + ","
              }
              if(newString!=null) {
                  textView.text = newString
              }
         }
    }

}