Получение сенсорных событий в CardScrollView

У меня есть CardScrollView, в котором есть несколько элементов, и я хотел бы иметь возможность открывать меню для элемента, аналогичное встроенной временной шкале.

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

Однако что-то, кажется, поглощает все события onKeyDown.

public class HostsView extends CardScrollView {
  private String TAG = "HostsView";
  private HostsCardScrollAdapter cards;
  private Activity parent;

  public HostsView(Activity parent, HostDatabase hostDb) {
    super(parent);
    cards = new HostsCardScrollAdapter(parent);
            //populates the cards and what not
    this.setAdapter(cards);
    this.activate();
  }

  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {
                  //I never see this log
    Log.d(TAG, "Key event " + event.toString());
    if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
        parent.openOptionsMenu();
        return true;
    }
    return super.onKeyDown(keyCode, event);
  }
}

person kurtisnelson    schedule 24.11.2013    source источник
comment
См. code.google.com/p/google-glass. -api/issues/detail?id=401.   -  person Sean Barbeau    schedule 23.04.2014


Ответы (2)


Если вам нужно всего лишь обработать простое нажатие на карточку в CardScrollView, вы можете вызвать setOnItemClickListener, чтобы прикрепить AdapterView.OnItemClickListener, как и в стандартном Android ListView. Обычно это намного проще, чем работать с GestureDetector для этого базового варианта использования.

person Tony Allevato    schedule 25.11.2013
comment
Похоже, это вообще не работает с CardScrollView, пробовал как setOnItemClickListener, так и setOnItemSelectedListener. Есть ли хитрость? Хотя GestureDetector работает нормально. - person javram; 25.12.2013
comment
OnItemClickListener должен срабатывать при касании элемента (если вы не делаете что-то в другом месте, что приводит к перехвату событий касания), а OnItemSelectedListener должен срабатывать при прокрутке от одной карточки к другой. Можете ли вы опубликовать код, где он не работает для вас? - person Tony Allevato; 25.12.2013
comment
Вау, ответ в день Рождества! Вот посвящение! Я попытался воссоздать это снова, и теперь это работает. и это хорошо. OnItemClickListener — это примерно половина кода. Единственное, что я изменил со вчерашнего дня, это то, что теперь я использую пользовательское представление вместо класса Card. Могло ли это иметь какое-то влияние? - person javram; 25.12.2013
comment
(Семья спала, почему бы не проверить StackOverflow? :) Класс Card не должен вызывать здесь никаких проблем — в представлениях класса Card нет ничего, что отвлекало бы внимание от самого скроллера. Мое первое подозрение было бы проблемой активации/деактивации, может быть? Но я рад слышать, что это работает, по крайней мере, сейчас! - person Tony Allevato; 25.12.2013
comment
еще раз спасибо, еще один быстрый, полусвязанный вопрос. Где я могу найти иерархию представлений для класса карты в виде xml? Я хотел бы использовать карту в качестве основы для своего пользовательского представления вместо того, чтобы пытаться свернуть свое собственное. Источник доступен где-то? - person javram; 25.12.2013
comment
Источник для этих макетов недоступен. Сами макеты могут измениться в то время, когда GDK находится в предварительном просмотре, поэтому мы не рекомендуем зависеть от точной иерархии представлений или идентификаторов представлений, поскольку это может быть очень хрупким. Если вам нужен определенный тип макета, лучше всего создать свой собственный с нуля. - person Tony Allevato; 25.12.2013

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

private GestureDetector mGestureDetector;

@Override
public void onCreate(Bundle savedInstanceState) {
mGestureDetector = createGestureDetector(this);
}


private GestureDetector createGestureDetector(Context context) {
    GestureDetector gestureDetector = new GestureDetector(context);
    gestureDetector.setBaseListener( new GestureDetector.BaseListener() {
        @Override
        public boolean onGesture(Gesture gesture) {
            if (gesture == Gesture.LONG_PRESS || gesture == Gesture.TAP) {
                Log.d(MainActivity.TAG, "Tap"); //When I tap the touch panel, I only get LONG_PRESS
                openOptionsMenu();
                return true;
            } else if (gesture == Gesture.TWO_TAP) {

                return true;
            } else if (gesture == Gesture.SWIPE_RIGHT) {

                return true;
            } else if (gesture == Gesture.SWIPE_LEFT) {

                return true;
            }
            return false;
        }
    });
    return gestureDetector;
}

@Override
public boolean onGenericMotionEvent(MotionEvent event) {
    if (mGestureDetector != null) {
        return mGestureDetector.onMotionEvent(event);
    }
    return false;
}

Ваше меню должно открыться прямо сейчас!

person Racker    schedule 25.11.2013
comment
Детектор жестов рекомендуется на developers.google.com/glass/develop/gdk/input. /touch, но у меня это работало только с LONG_PRESS - person Racker; 05.12.2013
comment
Это работает, но канонически правильным ответом будет использование AdapterView.OnItemClickListener, как это предлагается в другом ответе ниже. - person wmarbut; 03.01.2014