【问题标题】:As a user starts to type in an EditText can it append a file extension to the end?当用户开始输入 EditText 时,它可以在末尾附加文件扩展名吗?
【发布时间】:2022-01-24 14:09:13
【问题描述】:

问题:我一直在尝试在用户键入时实时附加一个文件扩展名,但未成功。

我的尝试:我一直在尝试使用我认为正确的.addTextChangedListener(),但在尝试实现这个想法时遇到了问题。调试节目不断循环,所以它给人一种冻结的外观。我在论坛上查看了一些帖子,但是当我输入此帖子标题时建议的帖子标题处理的是前缀而不是后缀。

EditText 字段,高亮区域表示光标右侧的文本:

我试图让它发挥作用的一个糟糕的尝试:

private void setupAddDBEditText(){

    mDBToAdd.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

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

        @Override
        public void afterTextChanged(Editable s) {
            if(s.toString().contains(".db"))
                mDBToAdd.setText(s.toString().substring(0,s.toString().length()-3));
            mDBToAdd.setText(s + ".db");
        }
}

【问题讨论】:

    标签: java android android-edittext append


    【解决方案1】:

    您需要在更改文本时移除监听器(这就是您获得无限循环的原因)。

    您可以创建一个自定义TextWatcher 来处理这种事情(如下),将自己作为观察者移除,更改文本并将光标放在正确的位置,然后将自己添加回来。

    public class FileExtensionTextWatcher implements TextWatcher {
        private final String extension;
        private final EditText text;
    
        FileExtensionTextWatcher(EditText t, String ext) {
            extension = ext;
            text = t;
        }
    
        // you may want to change around the logic in here to allow for
        // odd entries or other changes - but the overall approach should
        // be similar
        private String removeAutoExtension(String s) {
            String ext = "." + extension;
            if( s.contains(ext) ) {
                int ei = s.lastIndexOf(ext);
                if( ei == 0 ) return "";
                String trailingChar = "";
                if( ei < s.length() - ext.length() ) {
                    trailingChar = s.substring(ei+ext.length());
                }
                return s.substring(0,ei) + trailingChar;
            }
            else {
                return s;
            }
        }
    
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { }
    
        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { }
    
        @Override
        public void afterTextChanged(Editable txt) {
            if( txt == null ) return;
    
            String currentText = txt.toString();
            String filename = removeAutoExtension(currentText);
            int initCursor = filename.length();
            String displayedText;
            if( filename.isEmpty() ) {
                displayedText = filename;
            }
            else {
                displayedText = filename + "." + extension;
            }
    
            text.removeTextChangedListener(this);
            txt.clear();
            txt.insert(0, displayedText);
            text.setSelection(initCursor);
            text.addTextChangedListener(this);
        }
    }
    
    

    然后你会像这样使用它

    EditText e = findViewById(R.id.edit_text);
    e.addTextChangedListener(new FileExtensionTextWatcher(e, "db"));
    

    这是它外观的演示 GIF。

    您可能需要进行一些更改来处理诸如是否允许用户输入他们自己的扩展程序(此表单不允许 - 但您可以通过自定义观察程序中的一些额外逻辑进行更改)。

    【讨论】:

    • 哇,我很感激,感谢您的工作和演示,我没想到会这样。我研究并逐步完成了它 - 很好!我可能不会修改它。我喜欢它的限制性,我可能会保持原样,并进一步限制一些特殊字符和空格,这些是我通过活动布局获得的。 - 再次感谢。
    猜你喜欢
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 2016-05-29
    相关资源
    最近更新 更多