Запрет обновления / перерисовки других представлений, кроме textview, при настройке текста textview каждую секунду - PullRequest
2 голосов
/ 21 февраля 2012

У меня есть немного сложный макет, содержащий несколько пользовательских представлений, каждый из которых рассчитывает, сколько места им нужно и еще много чего. В верхней части этого макета у меня есть TextView, который должен отсчитывать от, скажем .. 02:04:20 (чч: мм: сс), и обновлять каждую секунду.

Моя проблема не в обновлении текста, проблема в том, что когда я действительно обновляю текст, ВСЕ виды в моем макете перерисовываются. Кроме того, я использую галерею в этом макете, поэтому при взаимодействии с галереей, когда текст обновляется, галерея мгновенно переключается на выбранное вами место (даже если вы находитесь в процессе перехода к новому элементу в галерее).

Итак. Как обновить текстовое представление, не перерисовывая другие виды?

1 Ответ

7 голосов
/ 25 июля 2012

TextView не сделает недействительным весь макет в setText (), если ширина представления фиксирована и высота представления не изменится. Измените параметр макета android:layout_width с "wrap_content" на фиксированную ширину, например "fill_parent" или "100sp".

Источник :

/**
 * Check whether entirely new text requires a new view layout
 * or merely a new text layout.
 */

private void checkForRelayout() {
    // If we have a fixed width, we can just swap in a new text layout
    // if the text height stays the same or if the view height is fixed.

    if ((mLayoutParams.width != LayoutParams.WRAP_CONTENT ||
            (mMaxWidthMode == mMinWidthMode && mMaxWidth == mMinWidth)) &&
            (mHint == null || mHintLayout != null) &&
            (mRight - mLeft - getCompoundPaddingLeft() - getCompoundPaddingRight() > 0)) {
        // Static width, so try making a new text layout.

        int oldht = mLayout.getHeight();
        int want = mLayout.getWidth();
        int hintWant = mHintLayout == null ? 0 : mHintLayout.getWidth();

        /*
         * No need to bring the text into view, since the size is not
         * changing (unless we do the requestLayout(), in which case it
         * will happen at measure).
         */
        makeNewLayout(want, hintWant, UNKNOWN_BORING, UNKNOWN_BORING,
                      mRight - mLeft - getCompoundPaddingLeft() - getCompoundPaddingRight(),
                      false);

        if (mEllipsize != TextUtils.TruncateAt.MARQUEE) {
            // In a fixed-height view, so use our new text layout.
            if (mLayoutParams.height != LayoutParams.WRAP_CONTENT &&
                mLayoutParams.height != LayoutParams.MATCH_PARENT) {
                invalidate();
                return;
            }

            // Dynamic height, but height has stayed the same,
            // so use our new text layout.
            if (mLayout.getHeight() == oldht &&
                (mHintLayout == null || mHintLayout.getHeight() == oldht)) {
                invalidate();
                return;
            }
        }

        // We lose: the height has changed and we have a dynamic height.
        // Request a new view layout using our new text layout.
        requestLayout();
        invalidate();
    } else {
        // Dynamic width, so we have no choice but to request a new
        // view layout with a new text layout.

        nullLayouts();
        requestLayout();
        invalidate();
    }
}
...