如何制作具有字符限制并忽略 url 的所有字符的编辑文本

How to make a edit text which has a limit of char and ignores all the chars of a url

我们如何制作自定义编辑文本,例如限制为 300 个字符。但是,如果用户输入很长的 link,比如 200 个字符,我该如何减少 link 的字符数?例如:

User entered : Hello world
Length       : 11

User entered : Hello https://whosebug.com
Length       : 7 // adding only one char for a url

这是一个基于自我回答的问题,因为我认为这是人们的普遍需求。我已经在 java 和 kotlin

中添加了代码

此代码适用于 java:

import android.content.Context;
import android.util.AttributeSet;
import android.util.Patterns;

import androidx.annotation.NonNull;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

public class CustomEditText extends androidx.appcompat.widget.AppCompatEditText {

    private int charCount = 0;

    public CustomEdiText(Context context, AttributeSet set) {
        super(context, set);
    }

    public CustomEdiText(@NonNull Context context) {
        super(context);
    }

    @Override
    protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
        super.onTextChanged(text, start, lengthBefore, lengthAfter);
        List<String> urls = extractUrls(text.toString());

        String removedText = text.toString();
        if(urls.size() != 0){
            for (String mText: urls) {
                removedText = text.toString().replaceAll(mText," ");
            }
            charCount = removedText.length();
            return;
        }

        charCount = text.toString().length();
    }

    public int getCharCount(){
        return charCount;
    }

    private List<String> extractUrls(String input) {
        List<String> result = new ArrayList<>();

        String[] words = input.split("\s+");

        Pattern pattern = Patterns.WEB_URL;
        for(String word : words)
            if (pattern.matcher(word).find())
                result.add(word);
        return result;
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        super.setText(text, type);
        List<String> urls = extractUrls(text.toString());

        String removedText = text.toString();
        if(urls.size() != 0){
            for (String mText: urls) {
                removedText = text.toString().replaceAll(mText," "); // 1 space as I want url to be one char on counting
            }
            charCount = removedText.length();
            return;
        }

        charCount = text.toString().length();
    }
}

您可以像普通编辑文本一样使用它 class。

要获取长度,您可以调用:

editText.getCharCount();

不要使用 .length() 否则你会得到错误的结果

此外,Kotlin 代码:

import android.content.Context
import android.util.Patterns
import androidx.appcompat.widget.AppCompatEditText


class CustomEditText(context: Context) : AppCompatEditText(context) {
    var charCount = 0
        private set

    override fun onTextChanged(
        text: CharSequence,
        start: Int,
        lengthBefore: Int,
        lengthAfter: Int
    ) {
        super.onTextChanged(text, start, lengthBefore, lengthAfter)
        val urls = extractUrls(text.toString())
        var removedText = text.toString()
        if (urls.isNotEmpty()) {
            for (mText in urls) {
                removedText = text.toString().replace(mText.toRegex(), " ")
            }
            charCount = removedText.length
            return
        }
        charCount = text.toString().length
    }

    private fun extractUrls(input: String): List<String> {
        val result: MutableList<String> = ArrayList()
        val words = input.split("\s+").toTypedArray()
        val pattern = Patterns.WEB_URL
        for (word in words) if (pattern.matcher(word).find()) result.add(word)
        return result
    }

    override fun setText(text: CharSequence, type: BufferType) {
        super.setText(text, type)
        val urls = extractUrls(text.toString())
        var removedText = text.toString()
        if (urls.isNotEmpty()) {
            for (mText in urls) {
                removedText = text.toString().replace(
                    mText.toRegex(),
                    " " // 1 space as I want url to be one char on counting
                )
            }
            charCount = removedText.length
            return
        }
        charCount = text.toString().length
    }
}

同理,可以调用

editText.charCount