Подтвердить что ты не робот

Как заставить просмотр перерисовываться непосредственно перед выполнением следующей строки кода

У меня есть LinearLayout, что я хотел бы изменить цвет фона при нажатии одного из его дочерних представлений (ImageButton). Я могу это сделать, но не сразу - изменение не происходит на экране до более позднего времени (я думаю, во время вызова onResume). Я хотел бы узнать, как заставить макет перерисовывать после того, как фон установлен, перед выполнением следующей строки кода. Вот метод onClick моего OnClickListener для кнопки:

public void onClick(View v) {

  LinearLayout parentLayout = (LinearLayout) v.getParent();
  parentLayout.setBackgroundResource(R.color.my_color);
  SystemClock.sleep(1000); //ms

}

Команда sleep находится там, чтобы проверить, происходит ли перерисовка до или после нее. Результат: после. Большинство вопросов по этой теме (например здесь и здесь) говорят о том, что для просмотра используется invalidate(). Я использовал команды parentLayout.invalidate();, parentLayout.postInvalidate(); и parentLayout.refreshDrawableState(); между фоновыми и линиями сна, но все это не помогло. Повторное изменение все еще происходит после команды sleep. Может ли кто-нибудь сказать мне, как сделать это немедленно?

Другая полезная информация: LinearLayout привязан к строкам ListView, а OnClickListener выше в пользовательском классе, который расширяет SimpleCursorAdapter, а не в самой активности. (Таким образом, я могу установить слушатель для каждой из строк в ListView.)

4b9b3361

Ответ 1

Хорошо, я наконец нашел решение этой проблемы, и это просто. Похоже, проблема заключалась в том, что я выполнял доступные изменения в OnClickLIstener, когда я должен был делать это в OnTouchListener. Если я установил OnTouchListener для своей кнопки, которая ищет ACTION_DOWN, а затем запускает setBackgroundColor в своем родительском макете, это происходит немедленно.

Альтернативное, менее надежное решение происходит от этого сообщения. Вы можете назначить селектор для фона родительского макета в xml, а затем в OnTouchListener, упомянутом выше, запустите setPressed (true) на этом макете. Это не отличное решение, потому что селектор дает вам гораздо меньше свободы, чем прямое изменение свойств представления в коде. Например, вы не можете установить фон макета на другой цвет, нажав, например, другую кнопку.

Спасибо тем, кто помог с предложениями по этому поводу.

Ответ 2

Вы можете попробовать forceLayout() с вызовом draw(canvas) сразу после. Если вы не переопределили onLayout(), onMeasure, draw() или onDraw(), тогда будет выполняться реализация по умолчанию. Единственная проблема заключается в том, что вам нужно либо получить Canvas, либо создать его вручную.

Настоятельно не рекомендуется придерживаться такого подхода, поскольку Android специально разработан, чтобы избежать рисования вне обычных обновлений. Хотя вы правы, что invalidate() не происходит сразу, это самый безопасный и лучший способ поощрения перерисовки. Если вы хотите обрабатывать чертеж за пределами обновлений, Android предоставляет способ сделать это с помощью класса SurfaceHolder.

Ответ 3

внести изменения и вызвать listview.invalidate(); для отражения этих изменений в пользовательском интерфейсе