Android TextView с автоматическим изменением размера, только уменьшенный размер шрифта? - PullRequest
0 голосов
/ 12 мая 2018

В течение многих лет я отчаянно стремился к тому, чтобы в TextViews для Android была предусмотрена функция размера шрифта «сжать, чтобы соответствовать», что есть в iOS, и теперь, когда наконец-то добавлено автоматическое изменение размера, я обнаружил, что это не просто «сжатие, чтобы соответствовать»но он также «расширяется, чтобы соответствовать», что на самом деле совсем не то, на что я надеялся.

Я уже устанавливаю свой предпочтительный размер шрифта в моем TextView (хотя не напрямую, я использую встроенные стили), единственный раз, когда мне нужно, чтобы размер шрифта автоматически изменялся, - это если текст не помещается внутри заданного пространства, и мне нужно уменьшить его до нужного размера.К сожалению, я получаю ситуацию, когда мне просто нужно установить текст, скажем, «Кенни», и вместо того, чтобы оставить его на TextAppearance.Medium, потому что он вписывается в данное пространство, он превращается в нечто вроде 60sp размер шрифта.Совершенно нелепо.

1) Есть ли прямой способ сказать, что авторазмер «только сжимается»?Я так не думаю, но в случае, если я пропустил это, я бы хотел, чтобы вы меня поправили.

2) Предполагая, что для № 1 нет варианта, я предполагаю, что мой единственный другой вариантэто установить autoSizeMaxTextSize на то же значение, что и мой textSize ... но я стараюсь избегать каждой установки этого значения напрямую.Я стараюсь полагаться на TextAppearance.Small, TextAppearance.Medium и TextAppearance.Large, когда это возможно.

Итак, как мне сослаться на значение textSize и использовать его для установки autoSizeMaxTextSize в моих стилях?

<style name="Text.Large" parent="TextAppearance.AppCompat.Large">
    <item name="autoSizeTextType">uniform</item>
    <item name="autoSizeMaxTextSize">?????</item>
</style>

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Если кто-то найдет более элегантное решение, пожалуйста, дайте мне знать. До этого я решил решить эту проблему с помощью подклассов AppCompatTextView и изменения максимального размера в коде. Класс barebones, который я использую, приведен ниже. Если есть какие-либо другие методы, которые я должен переопределить, чтобы убедиться, что я обновляю значение при изменении размера текста, сообщите мне:

public class TextLabel extends AppCompatTextView {

    private void updateAutoSizeConfiguration() {

        int minsize = TextViewCompat.getAutoSizeMinTextSize(this);
        if (minsize < 0) {
            minsize = spToPx(12, getContext());
        }

        int textsize = (int)Math.floor(getTextSize());

        int granularity = TextViewCompat.getAutoSizeStepGranularity(this);
        if (granularity < 0) {
            granularity = spToPx(1, getContext());
        }

        TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(this, minsize,
                textsize, granularity, TypedValue.COMPLEX_UNIT_PX);

    }

    public TextLabel(Context context) {
        super(context);
        updateAutoSizeConfiguration();
    }

    public TextLabel(Context context, AttributeSet attrs) {
        super(context, attrs);
        updateAutoSizeConfiguration();
    }

    public TextLabel(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        updateAutoSizeConfiguration();
    }

    @Override
    public void setTextSize(int unit, float size) {
        super.setTextSize(unit, size);
        updateAutoSizeConfiguration();
    }

    @Override
    public void setTextAppearance(Context context, int resId) {
        super.setTextAppearance(context, resId);
        updateAutoSizeConfiguration();
    }


}
0 голосов
/ 12 мая 2018

Вы можете попробовать установить wrap_content для ширины и высоты textView, а не установить autoResize в его xml, а затем в java-проверке, чтобы увидеть, равна ли ширина textView его родительскому элементу (плюс возможные поля и отступы, которые вы, возможно, указали) (то есть текст может быть только меньше), если да, установите autoResize в true

...