Intereting Posts
Центрирование растрового маркера (Google Maps Android API v2) Как обнаружить пользователя руки, удерживающего его устройство Анимация не запускается в элементах ListView, которые в настоящее время видны Создайте общий класс для пользовательского диалога в java Android Как использовать «репо» для клонирования минимального источника андроида? Проблема с Android NDK и Cygwin OpenGl визуализируется прямо в растровое (без какого-либо представления) Почему видовое окно браузера Android значительно меньше фактического размера экрана мобильного телефона даже при использовании width = device-width? Овальная форма обрезается при создании программно Программно подключаться к сопряженному Bluetooth-устройству Xamarin.Android сборки / развертывания очень медленно. Как ускорить их? Удаление «окна» из флажка в Android Подписание apk как системы с использованием ключей, найденных в source / build / target / product / security / Как заставить всех детей (видимых и невидимых) из ListView? Android SQLite: заявление о обновлении

Вызов TextView.setText () перерисовывает весь экран, несмотря на иерархию представлений

В моем приложении у меня есть отображение времени, которое обновляется каждую секунду. Каждый раз, когда TextView, используемый для поля секунд, изменяется, инструмент «Параметры разработчика»> «Показать поверхность» мигает на весь экран. Я огляделся и действительно могу найти этот вопрос, который довольно хорошо поясняет, что нет способа предотвратить появление TextView для ретрансляции хотя бы для части окна. Поэтому я был уверен, что мои TextView будут упакованы в их собственный контейнер, но у меня все еще такая же проблема. Каждый вызов setText () вызывает мигание всего представления.

Моя иерархия выглядит следующим образом:

  • Фрагмент
    • RelativeLayout (Внешний вид фрагмента)
      • LinearLayout
        • RelativeLayout
          • Мое время TextViews
      • Различные другие компоненты представления, которые меняются редко

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

Solutions Collecting From Web of "Вызов TextView.setText () перерисовывает весь экран, несмотря на иерархию представлений"

Отображение обновлений поверхности мигает во весь экран, когда аппаратное ускорение включено, но это не означает, что все окно было перерисовано. Существует еще один вариант, который вы можете использовать, который показывает, какая именно часть экрана была перерисована при включенном аппаратном ускорении («Показать обновления графического процессора»).

Я столкнулся с аналогичной проблемой, когда я обновлял таймер, который каждый раз вызывал меру. Если у вас есть что-то дорогое для измерения, например ListView, это влияет на производительность. В моем случае у меня был ListView, который не нуждался в изменении размера, когда таймер обновлялся, поэтому я сделал собственный держатель ListView, чтобы остановить измерение от каскадирования до ListView. Теперь он работает гладко!

public class CustomListviewHolderLayout extends FrameLayout { public int currentWidth = 0; public int currentHeight = 0; public CustomListviewHolderLayout(Context context) { super(context); } public CustomListviewHolderLayout(Context context, AttributeSet attrs) { super(context, attrs); } public CustomListviewHolderLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { //Debug Prints String wMode = ""; switch(MeasureSpec.getMode(widthMeasureSpec)){ case MeasureSpec.AT_MOST: wMode = "AT_MOST"; break; case MeasureSpec.EXACTLY: wMode = "EXACTLY"; break; case MeasureSpec.UNSPECIFIED: wMode = "UNSPECIFIED"; break; default: wMode = ""; } String hMode = ""; switch(MeasureSpec.getMode(heightMeasureSpec)){ case MeasureSpec.AT_MOST: hMode = "AT_MOST"; break; case MeasureSpec.EXACTLY: hMode = "EXACTLY"; break; case MeasureSpec.UNSPECIFIED: hMode = "UNSPECIFIED"; break; default: hMode = ""; } Log.i("RandomCustomListViewHolder", "wMode = " + wMode + ", size = " + MeasureSpec.getSize(widthMeasureSpec)); Log.i("RandomCustomListViewHolder", "hMode = " + hMode + ", size = " + MeasureSpec.getSize(heightMeasureSpec)); //only remeasure child listview when the size changes (eg orientation change) if(getChildCount() == 1){ if(((MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY) || (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.AT_MOST)) &&((MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.EXACTLY) || (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST))){ //check if height dimensions are different than before int newWidth = MeasureSpec.getSize(widthMeasureSpec); int newHeight = MeasureSpec.getSize(heightMeasureSpec); if((newWidth != currentWidth) || (newHeight != currentHeight)){ //remeasure if different Log.i("RandomCustomListViewHolder", "measuring listView"); View childView = getChildAt(0); childView.measure(widthMeasureSpec, heightMeasureSpec); currentWidth = newWidth; currentHeight = newHeight; this.setMeasuredDimension(newWidth, newHeight); } else { //still set this view's measured dimension this.setMeasuredDimension(newWidth, newHeight); } } else { //Specify match parent if one of the dimensions is unspecified this.setMeasuredDimension(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); } } else { //view does not have the listview child, measure normally super.onMeasure(widthMeasureSpec, heightMeasureSpec); currentWidth = 0; currentHeight = 0; } } }