Селектор применяет изменения ко всем представлениям, а не к выбранному виду

Я работаю над добавлением выделения onClick в представление в сетке перетаскивания в Android. Проект находится на GitHub (ветка dev содержит код, использующий селектор).

Проблема, с которой я сталкиваюсь, заключается в адаптере, когда я устанавливаю селектор onClick в качестве фона представления, когда я нажимаю на представление, вместо изменения фона только для этого представления селектор меняет фон для всех представлений.

Я почти уверен, что это результат того, как клики обрабатываются в onTouch в ViewGroup (ниже). Я не уверен, должен ли я возвращать true/false по-разному или запускать прослушиватель onClick по-разному, чтобы предотвратить выделение всех представлений.

Любые идеи/помощь приветствуются, спасибо.

@Override
public boolean onTouch(View v, MotionEvent event) {
    int action = event.getAction();
    switch (action & MotionEvent.ACTION_MASK) {
    case MotionEvent.ACTION_DOWN:
        touchDown(event);
        break;
    case MotionEvent.ACTION_MOVE:
        touchMove(event);
        break;
    case MotionEvent.ACTION_UP:
        touchUp(event);
        break;
    }
    if (aViewIsDragged())
        return true;
    return false;
}

private void touchUp(MotionEvent event) {
    if(dragged == -1) {
        if(onClickListener != null) {
            View clickedView = getChildAt(getTargetAtCoor((int) event.getX(), (int) event.getY()));
            if(clickedView != null)
                onClickListener.onClick(clickedView);
        }
    } else {
        manageChildrenReordering();
        hideDeleteView();
        cancelEdgeTimer();

        movingView = false;
        dragged = -1;
        lastTarget = -1;
        container.enableScroll();
        cancelAnimations();
    }
}

РЕДАКТИРОВАТЬ: После просмотра документации ViewGroup android:addStatesFromChildren похоже на то, что я ищу, но, похоже, это не имеет никакого эффекта.

Android: добавитьStatesFromChildren

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

Должно быть логическое значение, либо "true", либо "false".

Это также может быть ссылка на ресурс (в виде "@[package:]type:name") или атрибут темы (в виде "?[package:][type:]name"), содержащий значение этого типа. .

Это соответствует символу ресурса глобального атрибута addStatesFromChildren.

ОБНОВЛЕНИЕ

Я нашел способ решить эту проблему. Запрос на вытягивание находится здесь


person Luke    schedule 11.12.2012    source источник
comment
есть ли шанс увидеть ваш метод onClickListener? Может быть, PerformClick может помочь?   -  person AndroidPenguin    schedule 13.12.2012
comment
onClickListener — это просто ссылка на прослушиватель кликов (в данном случае это действие), и он просто создает тост. Я поменял onClickListener.onClick(clickedView) на clickedView.performClick(), но происходит то же самое, и, кроме того, прослушиватель кликов не вызывается   -  person Luke    schedule 13.12.2012


Ответы (1)


Изменить

Добавьте layout.setClickable(true); в функцию просмотра (где-то между строками 133 и 156), чтобы сделать каждый элемент кликабельным. Это необходимо для того, чтобы они имели свое собственное выбираемое состояние. Без него сетка получает прикосновение, и это состояние передается каждому дочернему элементу. Это нарушает вашу функциональность onTouch, но это будет отдельный вопрос.

Если вы не хотите беспокоиться об изменении функциональности вашего onTouch, вы можете вручную изменить фон выбранного элемента в различных сенсорных функциях вместо использования селектора.


Оригинал, который упустил суть:

Возможно, я что-то упускаю, но я думаю, что вы могли бы передать View "v" из onTouch и использовать его как clickedView вместо того, чтобы пытаться выяснить, какое представление оно основано на местоположении.

person Cameron    schedule 19.12.2012
comment
Поиск представления по местоположению существует, потому что он находит дочернее представление в этом местоположении, v из onTouch не всегда является дочерним и вызывает запуск кликов, когда пользователь просто касается пробела. Использование v из onTouch также не имеет ничего общего с проблемой, с которой я сталкиваюсь в своем вопросе. - person Luke; 19.12.2012
comment
Извините, видимо, я не понял, о чем вы спрашивали. Где в вашем коде находится селектор? Я бегло просмотрел, но ничего не увидел - person Cameron; 19.12.2012
comment
Это в ветке dev, селектор установлен как фон представления здесь, а сам селектор здесь - person Luke; 19.12.2012
comment
Великолепно, отлично фиксирует селектор. Любые идеи о том, как обращаться с onTouch сейчас? - person Luke; 19.12.2012
comment
@Luke Вам нужно либо добавить onTouchListener к каждому элементу, который вызывает прослушиватель сетки (не уверен, как вы это сделаете), либо удалить строку и селектор setClickable, а затем заставить сенсорные функции изменить фон представления. Второй вариант кажется мне проще, но у меня нет времени на тестирование, и я не уверен, как это повлияет на удобство использования библиотеки. - person Cameron; 19.12.2012