نظارات جوجل:فتح القائمة على اللمس في البطاقة العادية

StackOverflow https://stackoverflow.com//questions/21008928

سؤال

كيف يمكنني الحصول على القائمة المنبثقة بشكل منتظم 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);
    }
}
هل كانت مفيدة؟

المحلول

يبدو أنك تستخدم CardScrollView, ، والتي سوف تعترض جميع إيماءات لوحة اللمس وهذا هو السبب onKeyDown لا يتم استدعاء الأسلوب.

لهذه الحالة المحددة، يمكنك إرفاق OnItemClickListener إلى أداة تمرير البطاقة واستخدم هذا المستمع لمعرفة متى تم النقر على إحدى البطاقات.ثم اتصل openOptionsMenu من هناك.

إذا كنت بحاجة إلى عناصر قائمة مختلفة لبطاقات مختلفة، فستحتاج إلى تخزين فهرس البطاقة التي يتم تمريرها إلى المستمع ثم استخدام تلك المعلومات بالداخل onPrepareOptionsMenu لتحميل عناصر مختلفة.سيبدو التدفق كما يلي:

  1. يمكنك إنشاء حقل خاص في فصل النشاط الخاص بك والذي سيقوم بتخزين فهرس البطاقة الأخيرة التي تم النقر عليها.
  2. في الخاص بك onItemClick الطريقة، تقوم بتخزين الفهرس الذي تم تقديمه لك في هذا الحقل، ثم تقوم بالاتصال به openOptionsMenu.
  3. هذه تسبب onPrepareOptionsMenu ليتم استدعاؤها.تجاوز هذه الطريقة وقم بإجراء أي تعديلات تحتاجها على القائمة بناءً على الفهرس المخزن في هذا الحقل (تضخيم القائمة، وإضافة/إزالة العناصر، وما إلى ذلك).عليك أن تفعل هذا في الداخل onPrepareOptionsMenu بدلاً من onCreateOptionsMenu لأنك تريد أن يحدث ذلك كل الوقت الذي ينقر فيه المستخدم، وليس فقط في المرة الأولى التي يتم فيها تهيئة القائمة.
  4. مقبض onOptionsItemSelected كما تفعل عادة.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top