android editText ограничение длины строки не символами

Мне нужно убедиться, что входная строка может соответствовать строке, где я собираюсь показать это. Я уже знаю, как ограничить количество символов, но это не очень хорошо, потому что 2 строки с одинаковой длиной символа имеют разный размер... Например:

String1: "wwwwwwwwww"

String2: "iiiiiiiiii"

в Android string1 намного больше, чем строка 2, потому что "i" занимает меньше визуального пространства, чем "w"

2 ответа

Ты можешь использовать TextWatcher анализировать вводимый текст и Paint измерить ширину текущего значения текста.

Это код, который я использовал в функции TextWatcher afterTextChanged для этой цели. Я основал решение на совете Асахи. Я не профессиональный программист, поэтому код выглядит, вероятно, ужасно. Не стесняйтесь редактировать это, чтобы сделать это лучше.

//offset is used if you want the text to be downsized before it reaches the full editTextWidth
    //fontChangeStep defines by how much SP you want to change the size of the font in one step
    //maxFontSize defines the largest possible size of the font (in SP units) you want to allow for the given EditText
    public void changeFontSize(EditText editText, int offset, int maxFontSize, int fontChangeSizeStep) {
        int editTextWidth = editText.getWidth();
        Paint paint = new Paint();

        final float densityMultiplier = getBaseContext().getResources().getDisplayMetrics().density;
        final float scaledPx = editText.getTextSize();
        paint.setTextSize(scaledPx);
        float size = paint.measureText(editText.getText().toString());

        //for upsizing the font
        // 15 * densityMultiplier is subtracted because the space for the text is actually smaller than than editTextWidth itself
        if(size < editTextWidth - 15 * densityMultiplier - offset) {
            paint.setTextSize(editText.getTextSize() + fontChangeSizeStep * densityMultiplier);
            if(paint.measureText(editText.getText().toString()) < editTextWidth - 15 * densityMultiplier - offset) //checking if after possible upsize the text won't be too wide for the EditText
                if(editText.getTextSize()/densityMultiplier < maxFontSize)
                    editText.setTextSize(TypedValue.COMPLEX_UNIT_SP, editText.getTextSize()/densityMultiplier + fontChangeSizeStep);
        }
        //for downsizing the font, checking the editTextWidth because it's zero before the UI is generated
        while(size > editTextWidth - 15 * densityMultiplier - offset && editTextWidth != 0) { 
            editText.setTextSize(TypedValue.COMPLEX_UNIT_SP, editText.getTextSize()/densityMultiplier - fontChangeSizeStep);
            paint.setTextSize(editText.getTextSize());
            size = paint.measureText(editText.getText().toString());
        }
    }

Небольшой совет, если вы хотите изменить размер шрифта уже при загрузке действия. Это не будет работать, если вы используете функцию в методе OnCreate, потому что на данный момент пользовательский интерфейс еще не определен, поэтому вам нужно использовать эту функцию, чтобы получить желаемый результат.

@Override
     public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        changeFontSize(editText, 0, 22, 4);
     }
Другие вопросы по тегам