2010-10-04 10 views
7

Я использую представление галереи, где представление, соответствующее каждому элементу, является нетривиальным и состоит из текста, а также нескольких кнопок.Галерея/AdapterView Child Drawable State

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

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

Любые идеи?

ответ

3

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

8

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

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

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

+0

Это работает. Спасибо! – yuku

+0

удивительный исправление! Кто-нибудь знает, если это сообщение об ошибке для Android? Кажется, что не следует ожидать поведения. – MikeIsrael

1

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

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

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