Странное повреждение заголовка activity при использовании ListView

#java #android #user-interface #listview

#java #Android #пользовательский интерфейс #listview

Вопрос:

У меня есть класс (давайте пока назовем его MyWidget), который расширяет представление, в котором я выполняю некоторый пользовательский чертеж в onDraw (). MyWidget отлично работает в большинстве ситуаций, за исключением случаев добавления MyWidget в ListView или ScrollView в TabView. Когда в одной из этих конфигураций я постоянно наблюдаю, что прокрутка иногда перезаписывает область заголовка представления частичным изображением содержимого одного из экземпляров MyWidget.

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

повреждение экрана

Есть идеи?!

Дополнение: логика отсечения, которую я использую:

 try {
        canvas.save(Canvas.ALL_SAVE_FLAG);
        // do some clipping here
    } finally {
        canvas.restore();
}
  

Ответ №1:

Похоже, что пользовательский код рисования вашего представления выполняет трюки с прямоугольником клипа, и вы неправильно сохраняете / восстанавливаете состояние холста.

Комментарии:

1. Хм, мне трудно найти какие-либо ошибки clip. Я добавил базовую логику отсечения, которую я использую везде, где я отсекаю в своем коде. Есть идеи?

2. Похоже, проблема могла быть вызвана использованием Region.Op.REPLACE — я предполагаю, что ListView использует общедоступный клип, чтобы замаскировать верхнюю область, а REPLACE закрывает ее. В любом случае я смог переключиться на INTERSECT, и, похоже, все в порядке. Я приму ваше решение после того, как удостоверюсь, что проблема действительно устранена. Спасибо!

3. Именно так, если вы используете REPLACE, вы должны убедиться, что вы правильно вернули клип к тому, что было до того, как вы выполнили ЗАМЕНУ.

4. На самом деле я восстанавливал клип в исходное состояние. Я думаю, что его, вероятно, небезопасно использовать REPLACE с помощью ListView, потому что любые прорисовываемые элементы, которые должны быть скрыты областью заголовка, просто затенят эту маску клипа и все равно появятся там. Замена клипа обратно на то, что было после того, как вы закончили рисовать, не поможет.

5. Ну, рисованные файлы не загромождают клип, они обычно пересекаются с текущим клипом и сохраняют / восстанавливают. Просто, выполняя ЗАМЕНУ, вы позволяете им рисовать за пределами представления. Я рад, что вы все же разобрались.