Галерея/AdapterView дочернее рисуемое состояние

Я использую представление «Галерея», где представление, соответствующее каждому элементу, нетривиально и состоит из текста и нескольких кнопок.

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

Я пытаюсь предотвратить такое поведение и нашел атрибут xml android:duplicateParentState, а также свойство setDuplicateParentStateEnabled. Кажется, что это должно выполнить то, что я пытаюсь сделать, но, похоже, это не имеет никакого эффекта.

Любые идеи?


person ghempton    schedule 04.10.2010    source источник


Ответы (3)


Может быть, немного поздно, но недавно я сам столкнулся с этой проблемой, и у меня есть решение.

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

Решение состоит в том, чтобы добавить дополнительный макет (я использовал подкласс LinearLayout) вокруг дочернего представления, который переопределяет setPressed(boolean) и просто игнорирует его. Это не позволяет галерее навязывать состояние нажатия дочерним элементам, в то же время позволяя активировать эти дочерние элементы напрямую и не останавливая распространение событий вверх.

person Adrian    schedule 27.01.2011
comment
потрясающее исправление! Кто-нибудь знает, является ли это зарегистрированной ошибкой для Android? Кажется, это не совсем ожидаемое поведение. - person MikeIsrael; 19.01.2012

Не знаю, где в игру вступает свойство DuplicaParentState, но анализ источника показывает, что оно никогда не учитывается для выбранных и нажатых состояний. Я бы создал собственный класс представления и переопределил методы dispatchSetSelected и dispatchSetPressed.

person ghempton    schedule 04.10.2010

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

  @Override
  public boolean onDown(MotionEvent e) {
    // Ignore onDown events in order to avoid having every child's state set to 'pressed'
    return true;
  }

Это по-прежнему позволит дочерним элементам пользовательской галереи правильно получать события кликов, а пролистывание/бросание работает, как предполагалось.

person Thomas Finsterbusch    schedule 23.03.2012