Google Glass: открыть меню на ощупь в обычной Карте

Как сделать так, чтобы всплывающее меню отображалось на обычном Card. Я пытался использовать этот код:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
     if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
          openOptionsMenu();
          return true;
     }
     return false;
}

Но, похоже, это не работает. Кроме того, можно ли поместить Live Cards в Activity, как я сделал здесь. Я полагаю, что использую Static Cards, но в конечном итоге мне понадобится доступ к функциям камеры и видео через эти карты.

Активность

public class NewChecklistActivity extends Activity {

private GestureDetector mGestureDetector;
private List<Card> mCards;
private CardScrollView mCardScrollView;
StepCardScrollAdapter adapter;

Intent checklistIntent;
String allStepsJSONString;
ArrayList<String[]> allStepsArray;
ArrayList<String[]> checklistsArray;
ArrayList<String[]> stepsArray;
ArrayList<String[]> checklistSteps;

@SuppressWarnings("unchecked")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    checklistsArray = (ArrayList<String[]>) this.getIntent().getSerializableExtra("checklists");
    stepsArray = (ArrayList<String[]>) this.getIntent().getSerializableExtra("steps");

    createCards();
    mCardScrollView = new CardScrollView(this);
    adapter = new StepCardScrollAdapter();
    mCardScrollView.setAdapter(adapter);
    mCardScrollView.activate();
    setContentView(mCardScrollView);
    mCardScrollView.setOnItemClickListener(adapter);
    checklistIntent = new Intent(this, ChecklistActivity.class);
}

private void createCards() {
    mCards = new ArrayList<Card>();
    Card card;
    String[] checklist;

    for (int i = 0; i < checklistsArray.size(); i++) {
        checklist = checklistsArray.get(i);
        card = new Card(this);
        card.setText(checklist[1]);
        mCards.add(card);
    }
}

private class StepCardScrollAdapter extends CardScrollAdapter implements OnItemClickListener {

    @Override
    public int findIdPosition(Object id) {
        return -1;
    }

    @Override
    public int findItemPosition(Object item) {
        return mCards.indexOf(item);
    }

    @Override
    public int getCount() {
        return mCards.size();
    }

    @Override
    public Object getItem(int position) {
        return mCards.get(position);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return mCards.get(position).toView();
    }

    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        checklistIntent.putExtra("steps", getChecklistSteps(adapter.findItemPosition(position)));
        startActivity(checklistIntent);
    }
}

person The Nomad    schedule 08.01.2014    source источник
comment
эта строка if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) реагирует на каждое прикосновение, я имею в виду даже пролистывание вниз, назад и вперед, включая касание.. так что, если вы хотите, чтобы это работало только для касания и ничего больше (например, назад) Думаю, лучше использовать класс GestureDetector... см. здесь developers.google .com/glass/develop/gdk/input/touch   -  person uLYsseus    schedule 06.03.2014
comment
+1 за новый взгляд на это событие!   -  person uLYsseus    schedule 06.03.2014


Ответы (1)


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

В этом конкретном случае вы можете прикрепить OnItemClickListener к скроллеру карт и использовать этот прослушиватель, чтобы узнать, когда одна из карточек нажата. Затем позвоните оттуда openOptionsMenu.

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

  1. Вы создаете приватное поле в своем классе активности, в котором будет храниться индекс последней использованной карты.
  2. В вашем методе onItemClick вы сохраняете индекс, указанный в этом поле, а затем вызываете openOptionsMenu.
  3. Это вызывает вызов onPrepareOptionsMenu. Переопределите этот метод и внесите необходимые изменения в меню на основе индекса, хранящегося в этом поле (раздуйте меню, добавьте/удалите элементы и т. д.). Вы должны сделать это внутри onPrepareOptionsMenu вместо onCreateOptionsMenu, потому что вы хотите, чтобы это происходило каждый раз, когда пользователь нажимает, а не только при первой инициализации меню.
  4. Обращайтесь с onOptionsItemSelected как обычно.
person Tony Allevato    schedule 09.01.2014
comment
Отлично работает сейчас. Я добавил свой рабочий код выше. Спасибо за помощь и информацию о том, что CardScrollView перехватывает все жесты тачпада. - person The Nomad; 09.01.2014
comment
Есть вопрос относительно получения onItemClickLister нужного предмета. Я пытаюсь передать ArrayList, который содержит элементы, относящиеся к тому, какая карта была нажата. Как мне сохранить индекс карты, которая передается слушателю? Я добавил код для CardScrollAdapter выше. Спасибо! - person The Nomad; 09.01.2014
comment
Вероятно, было бы лучше, чтобы активность реализовывала слушателя (или реализовывала его в отдельном внутреннем классе), а не реализовывала его адаптером (только с точки зрения разработки программного обеспечения). Я редактирую свой ответ выше, чтобы прояснить процесс хранения индекса. - person Tony Allevato; 09.01.2014
comment
Я только что реализовал прослушиватель в onCreate, прикрепленном к CardScrollView. Спасибо за помощь! - person The Nomad; 11.01.2014