Autosizing TextViews in RecyclerView causes text size to decrease

后端 未结 6 843
野趣味
野趣味 2021-02-13 17:24

I am trying to use Autosizing TextViews in a RecyclerView, but when I scroll a few times the text gets so small that it\'s obviously not working properly.

Example of my

6条回答
  •  旧巷少年郎
    2021-02-13 17:55

    the above solutions didn't work for me so here's mine

    public class MyTextView extends AppCompatTextView {
        ...
        @Override
        public final void setText(CharSequence text, BufferType type) {
            // work around stupid auto size text not *growing* the font size we re binding in a RecyclerView if previous bind caused a small font
            int minTextSize = 0, maxTextSize = 0, granularity = 0;
            boolean doHack = TextViewCompat.getAutoSizeTextType(this) != TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE;
            if (doHack) {
                minTextSize = TextViewCompat.getAutoSizeMinTextSize(this);
                maxTextSize = TextViewCompat.getAutoSizeMaxTextSize(this);
                if (minTextSize <= 0 || maxTextSize <= minTextSize) { // better than validateAndSetAutoSizeTextTypeUniformConfiguration crashing
                    if (BuildConfig.DEBUG)
                        throw new AssertionError("fix ya layout");
                    doHack = false;
                } else {
                    granularity = TextViewCompat.getAutoSizeStepGranularity(this);
                    if (granularity < 0)
                        granularity = 1; // need this else setAutoSizeTextTypeUniformWithConfiguration barfs. TextView.UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE = 1.
                    // make the TextView have 0 size so setAutoSizeTextTypeUniformWithConfiguration won't do calculations until after a layout pass using maxSize
                    TextViewCompat.setAutoSizeTextTypeWithDefaults(this, TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE);
                    setTextSize(TypedValue.COMPLEX_UNIT_PX, maxTextSize);
                    measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(0, MeasureSpec.EXACTLY));
                    setRight(getLeft());
                    setBottom(getTop());
                    requestLayout();
                }
            }
            super.setText(text, type);
            if (doHack)
                TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(this, minTextSize, maxTextSize, granularity, TypedValue.COMPLEX_UNIT_PX);
        }
        ...
    }
    

提交回复
热议问题