τον πρώτο μήνα της προπόνησης. Ας ρίξουμε μια πιο προσεκτική ματιά στο μενού. Θα ληφθούν υπόψη τόσο παλιές συσκευές Android 2.3 όσο και νέα τηλέφωνα Android 4.0.

Μενού επιλογών

Η τάξη είναι υπεύθυνη για το μενού android.view.Menu. Κάθε δραστηριότητα σχετίζεται με ένα αντικείμενο μενού. Το ίδιο το μενού περιέχει στοιχεία μενού (κλάση android.view.MenuItem) και υπομενού (κλάση android.view.SubMenu).

Όταν πατάτε ένα κουμπί ΜενούΣε παλαιότερα τηλέφωνα, εμφανίζεται ένα σύνολο στοιχείων μενού που επισυνάπτονται στη δραστηριότητα. Το μενού μπορεί να περιέχει εικονίδια. Ένα τέτοιο μενού μπορεί να περιέχει έξι στοιχεία (κατά κανόνα). Εάν υπάρχουν περισσότερα από έξι στοιχεία, χρησιμοποιείται ένα εκτεταμένο μενού - σε αυτήν την περίπτωση, αντί για το έκτο στοιχείο, εμφανίζεται το στοιχείο Επιλογές(περισσότερο). Όταν πατηθεί αυτό το στοιχείο, εμφανίζεται ένα εκτεταμένο μενού με μια λίστα στοιχείων που δεν χωρούσαν στο κύριο μέρος του μενού επιλογής επιλογών.

Όταν το μενού ανοίγει για πρώτη φορά, το Android καλεί τη μέθοδο onCreateOptionsMenu(), μεταβιβάζοντας ένα αντικείμενο ως παράμετρο Μενού. Τα μενού μπορούν να δημιουργηθούν ως πόροι σε ένα αρχείο XML ή μπορείτε να το χρησιμοποιήσετε Προσθήκη().

Σε ένα τυπικό έργο, όταν επιλέγετε ένα κανονικό πρότυπο, υπάρχει ήδη ένα κενό για ένα μενού ενός σημείου Ρυθμίσειςκαι μια κλήση μεθόδου για το μενού (το γνωρίζετε ήδη).

Δημιουργία μενού με χρήση πόρων

Εξετάστε το ενδεχόμενο να εργαστείτε με το μενού μέσω πόρων. Για τη δημιουργία ενός μενού, χρησιμοποιούνται πόροι που πρέπει να αποθηκευτούν σε ένα αρχείο XML. Το ίδιο το αρχείο πρέπει να βρίσκεται στο φάκελο res/menu/το έργο σας. Το μενού αποτελείται από τα ακόλουθα στοιχεία:

Καθορίζει το μενού που θα περιέχει τα στοιχεία μενού. Στοιχείο πρέπει να είναι το ριζικό στοιχείο στη δομή XML του αρχείου και μπορεί να περιέχει ένα ή περισσότερα στοιχεία και Δημιουργεί απευθείας στοιχεία μενού. Αυτό το στοιχείο μπορεί να έχει ένα ένθετο στοιχείο για να δημιουργήσετε ένα υπομενού Προαιρετικά, μπορείτε επίσης να χρησιμοποιήσετε ένα δοχείο αόρατου στοιχείου . Αυτό σας επιτρέπει να επιτύχετε κάποια αποτελέσματα

Ας υποθέσουμε ότι αποφασίσαμε να χρησιμοποιήσουμε το μενού για κάποιο παιχνίδι. Ας δημιουργήσουμε νέο αρχείο game_menu.xml:

Έχουμε δημιουργήσει ένα μενού με δύο στοιχεία. Κάθε στοιχείο περιλαμβάνει τα ακόλουθα χαρακτηριστικά:

Android:id Αναγνωριστικό του στοιχείου μενού από το οποίο η εφαρμογή μπορεί να αναγνωρίσει πότε ο χρήστης επιλέγει το στοιχείο μενού android:title Το κείμενο που θα εμφανίζεται στο μενού

Υπάρχουν και άλλα χαρακτηριστικά για το στοιχείο είδος, για παράδειγμα android:icon="@drawable/home"θα εμφανίσει επίσης το εικονίδιο για το στοιχείο μενού και android:enabled="false"σας επιτρέπει να κάνετε το στοιχείο μενού μη διαθέσιμο.

Χαρακτηριστικό android:titleΣυμπυκνωμένοχρησιμοποιείται όταν ο κανονικός τίτλος είναι πολύ πλατύς για να "χωρέσει" στο επιλεγμένο στοιχείο μενού.

Χαρακτηριστικό android:orderInCategoryκαθορίζει τη σειρά με την οποία εμφανίζονται τα στοιχεία μενού MenuItems.

Κατά τη δημιουργία του μενού, δείξαμε τους πόρους συμβολοσειρών @string/new_gameκαι @string/help. Πρέπει να προσθέσετε νέες γραμμές στο αρχείο strings.xml:

Νέο παιχνίδι Αναφορά

Τώρα πρέπει να κάνουμε αλλαγές στην κατηγορία δραστηριότητας στην οποία θα εμφανίζεται το μενού. Το πρόγραμμα θα πρέπει να μετατρέψει τον πόρο του μενού που δημιουργήσαμε σε αντικείμενο προγράμματος. Υπάρχει ειδική μέθοδος για το σκοπό αυτό. MenuInflater.inflate(), που ονομάζεται σε ειδική μέθοδο επανάκληση onCreateOptionsMenu(). Αυτή η μέθοδος έχει σχεδιαστεί για να εμφανίζει ένα μενού όταν πατηθεί ένα κουμπί. ΜΕΝΟΥστη συσκευή:

@Override public boolean onCreateOptionsMenu( μενού μενού) ( MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.game_menu, μενού); επιστροφή true; )

Μετά την επικόλληση του κώδικα, το περιβάλλον ανάπτυξης θα σας ζητήσει να εισαγάγετε τους χώρους ονομάτων που λείπουν.

Εισαγωγή android.view.Menu; εισαγωγή android.view.MenuInflater;

Μέθοδος onCreateOptionsMenu()η μέθοδος ξεκινά την πρώτη εμφάνιση του μενού στην οθόνη και παίρνει ως παράμετρο ένα αντικείμενο Μενού (για παλαιότερες συσκευές). Μπορείτε να αποθηκεύσετε έναν σύνδεσμο προς το μενού και να τον χρησιμοποιήσετε οπουδήποτε στον κώδικά σας όσο η μέθοδος onCreateOptionsMenu()δεν θα κληθεί ξανά. Θα πρέπει πάντα να χρησιμοποιείτε την υλοποίηση γονικής κλάσης αυτού του προγράμματος χειρισμού, επειδή περιλαμβάνει αυτόματα πρόσθετα στοιχεία συστήματος στο μενού, εάν είναι απαραίτητο. Σε νέες συσκευές, η μέθοδος καλείται όταν δημιουργείται η δραστηριότητα. Η μέθοδος πρέπει να επιστρέψει μια τιμή αληθήςγια να κάνετε το μενού ορατό στην οθόνη.

Μετά την εκκίνηση του προγράμματος, πατήστε το κουμπί ΜΕΝΟΥστον εξομοιωτή για να δείτε το μενού που δημιουργήθηκε.

Μέθοδος getMenuInflater()επιστρέφει ένα στιγμιότυπο της κλάσης φουσκωτή μενού, το οποίο χρησιμοποιούμε για την ανάγνωση δεδομένων μενού από XML.

Όπως μπορείτε να δείτε, το μενού εμφανίζεται στο κάτω μέρος της οθόνης. Συνολικά έξι στοιχεία μενού μπορούν να εμφανιστούν ταυτόχρονα. Εάν υπάρχουν περισσότεροι πόντοι, τότε θα εμφανιστούν πέντε σημεία συν το έκτο σημείο Περισσότερο, που θα σας επιτρέψει να δείτε τα υπόλοιπα στοιχεία. Ας δοκιμάσουμε και ας προσθέσουμε νέα στοιχεία μενού.

Ας προσθέσουμε πρώτα έξι βαθμούς.

Ας προσθέσουμε ένα ακόμη στοιχείο στο μενού ώστε να είναι επτά.

Επιλογή στοιχείων μενού

Μάθαμε πώς να δημιουργούμε ένα μενού. Αλλά μέχρι στιγμής είναι άχρηστο, αφού τα στοιχεία του μενού δεν αντιδρούν με κανέναν τρόπο στα κλικ μας. Η μέθοδος χρησιμοποιείται για τον χειρισμό των κλικ σε στοιχεία μενού. onOptionsItemSelected(). Η μέθοδος αναγνωρίζει το στοιχείο που έχει επιλεγεί από τον χρήστη μέσω Στοιχείο μενού. Μπορούμε τώρα να προσδιορίσουμε το επιλεγμένο στοιχείο καλώντας getItemId(), το οποίο επιστρέφει το αναγνωριστικό του στοιχείου μενού. Περαιτέρω μέσω του χειριστή διακόπτηςΑπομένει να ορίσουμε τις απαραίτητες εντολές:

@Override public boolean onOptionsItemSelected(MenuItem item) ( // Λειτουργίες για τον επιλεγμένο διακόπτη στοιχείου μενού (item.getItemId()) ( case R.id.new_game: newGame(); return true; case R.id.help: showHelp( ). ;)

Εκκινήστε την εφαρμογή, καλέστε το μενού και επιλέξτε το πρώτο ή το δεύτερο στοιχείο μενού. Θα πρέπει να εμφανιστεί ένα μήνυμα στο πλαίσιο κειμένου.

Στο δεδομένο παράδειγμα getItemId()ζητά ένα αναγνωριστικό για το επιλεγμένο στοιχείο μενού και ξεκινά τη σύγκριση μέσω της δήλωσης επιλογής διακόπτη με τα αναγνωριστικά που ορίσαμε στους πόρους XML. Όταν βρεθεί το απαιτούμενο αναγνωριστικό, εκτελείται ο χειριστής για το δεδομένο στοιχείο μενού. Εάν το πρόγραμμα δεν βρει τίποτα, τότε η εντολή εκτελείται Προκαθορισμένο, που επιστρέφει την super class.

Στο Android 3.0, μπορείτε να προσθέσετε το χαρακτηριστικό android:onclickστους πόρους του μενού και δεν χρειάζεται πλέον να χρησιμοποιείτε onOptionsItemSelected(). Με βοήθεια android:onclickμπορείτε να καθορίσετε την επιθυμητή μέθοδο όταν επιλέγετε ένα στοιχείο μενού.

// το χαρακτηριστικό στοιχείου μενού ορίστηκε σε android:onClick="onMenuClick" δημόσιο κενό onMenuClick(Στοιχείο MenuItem)( edtext.setText("Ταΐστε τη γάτα επιλεγμένη");

Δημιουργία μενού μέσω προγραμματισμού

Σκεφτείτε δημιουργία λογισμικούμενού για πληρότητα. Θα χρειαστεί να ορίσουμε μερικές σταθερές για τα στοιχεία μενού:

// αναγνωριστικά για στοιχεία μενού ιδιωτική στατική τελική int IDM_OPEN = 101; private static final int IDM_SAVE = 102; δημόσιο boolean onCreateOptionsMenu(μενού μενού) ( // προσθήκη στοιχείων μενού menu.add(Menu.NONE, IDM_OPEN, Menu.NONE, "Open"); menu.add(Menu.NONE, IDM_SAVE, Menu.NONE, "Save") ;)

Στη μέθοδο Προσθήκη()υπάρχουν τέσσερις επιλογές:

  • αναγνωριστικό ομάδας - σας επιτρέπει να συσχετίσετε ένα στοιχείο μενού με μια ομάδα άλλων στοιχείων σε αυτό το μενού
  • αναγνωριστικό στοιχείου για το πρόγραμμα χειρισμού συμβάντων επιλογής στοιχείων μενού
  • σειρά του στοιχείου στο μενού - σας επιτρέπει να προσδιορίσετε τη θέση στο μενού. Από προεπιλογή (Menu.NONE ή 0) τα στοιχεία πηγαίνουν με τη σειρά που καθορίζεται στον κώδικα
  • τίτλος - το κείμενο που εμφανίζεται στο στοιχείο μενού. Μπορείτε να χρησιμοποιήσετε έναν πόρο συμβολοσειράς

Η μέθοδος επιστρέφει ένα αντικείμενο Στοιχείο μενού, το οποίο μπορεί να χρησιμοποιηθεί για τον ορισμό πρόσθετων ιδιοτήτων, όπως το εικονίδιο ορισμού, το πλήκτρο πρόσβασης κ.λπ.

Εάν θέλετε να δημιουργήσετε ένα μενού με εικονίδια, χρησιμοποιήστε τη μέθοδο setIcon()

Menu.add(Menu.NONE, IDM_OPEN, Menu.NONE, "Open") .setIcon(R.drawable.icon_menu_open);

Θυμηθείτε ξανά ότι τα εικονίδια μπορούν να προστεθούν μόνο σε έξι στοιχεία μενού (ή πέντε, εάν υπάρχουν περισσότερα από έξι στοιχεία).

Μέθοδος onCreateOptionsMenuκαλείται από το σύστημα μόνο μία φορά όταν δημιουργείται το μενού. Εάν χρειάζεται να ενημερώσετε το μενού ενώ το πρόγραμμα εκτελείται, χρησιμοποιήστε τη μέθοδο επανάκλησης onPrepareOptionsMenu().

Όταν επιλέγεται ένα στοιχείο μενού, καλείται η μέθοδος onOptionsItemSelected, που περνάει το αντικείμενο Στοιχείο μενού- στοιχείο μενού επιλεγμένο από τον χρήστη. Χρησιμοποιώντας τη μέθοδο getItemIdμπορείτε να λάβετε το αναγνωριστικό του επιλεγμένου στοιχείου μενού. Αφού προσδιορίσετε το στοιχείο μενού, μπορείτε να γράψετε κώδικα για να χειριστείτε το συμβάν επιλογής μενού:

Δημόσιο boolean onOptionsItemSelected(Στοιχείο MenuItem) (διακόπτης (item.getItemId()) περίπτωση IDM_OPEN: επιστροφή true; case IDM_SAVE: επιστροφή true; return false; )

Πλήκτρα συντόμευσης

Μπορείτε επίσης να ορίσετε πλήκτρα πρόσβασης για γρήγορη πρόσβαση χρησιμοποιώντας χαρακτήρες πληκτρολογίου χρησιμοποιώντας διάφορες μεθόδους:

  • setAlphabeticShortcut(char) - προσθέτει έναν χαρακτήρα
  • setNumericShortcut(int) - προσθέτει έναν αριθμό
  • setShortcut(char, int) - Προσθέτει έναν συνδυασμό χαρακτήρων και αριθμών

Για παράδειγμα, εάν ορίσετε το πλήκτρο πρόσβασης setAlphabeticShortcut("q"), τότε όταν ανοίγετε το μενού (ή κρατώντας πατημένο το πλήκτρο MENU), πατάτε το πλήκτρο Qεπιλέγει αυτό το στοιχείο μενού. Αυτό hot key(ή συντόμευση πληκτρολογίου) θα εμφανιστεί ως επεξήγηση εργαλείου που εμφανίζεται κάτω από το όνομα του στοιχείου μενού. Τα νεότερα πληκτρολόγια έχουν ξεχωριστό πλήκτρο ctrl, το οποίο λειτουργεί με τον ίδιο τρόπο όπως σε κανονικά πληκτρολόγια.

Τα πλήκτρα πρόσβασης μπορούν επίσης να δημιουργηθούν μέσω XML: android:alphabeticShortcut="c".

Μπορείτε να χειριστείτε τα κλικ μέσω της μεθόδου δραστηριότητας onKeyShortcut():

@Override public boolean onKeyShortcut(int keyCode, KeyEvent event) ( switch (keyCode) ( case KeyEvent.KEYCODE_R: Toast.makeText(this, "Reply", Toast.LENGTH_SHORT).show(); return true; default: return super. onKeyShortcut (Κωδικός κλειδιού, συμβάν); ) )

Δημιουργία υπομενού

Ένα υπομενού μπορεί να προστεθεί σε οποιοδήποτε μενού εκτός από ένα άλλο υπομενού. Το υπομενού δημιουργείται με τη μέθοδο επανάκλησης onCreateOptionsMenu()χρησιμοποιώντας τη μέθοδο addSubMenu()που επιστρέφει ένα αντικείμενο υπομενού. Αντιλέγω, διαμαρτύρομαι υπομενούμπορείτε να προσθέσετε επιπλέον στοιχεία σε αυτό το μενού χρησιμοποιώντας τη μέθοδο Προσθήκη(). Για παράδειγμα:

Δημόσιο στατικό τελικό int IDM_HELP = 101; δημόσιο στατικό τελικό int IDM_NEW = 201; δημόσιο στατικό τελικό int IDM_OPEN = 202; δημόσιο στατικό τελικό int IDM_SAVE = 203; δημόσιο στατικό τελικό int IDM_CUT = 301; δημόσιο στατικό τελικό int IDM_COPY = 302; δημόσιο στατικό τελικό int IDM_PASTE = 303; @Override public boolean onCreateOptionsMenu(μενού μενού) ( SubMenu subMenuFile = menu.addSubMenu("File"); subMenuFile.add(Menu.NONE, IDM_NEW, Menu.NONE, "New"); subMenuFile.add(Menu.NONE, IDM_OPEN , Menu.NONE, "Open"); subMenuFile.add(Menu.NONE, IDM_SAVE, Menu.NONE, "Save"); Submenu subMenuEdit = menu.addSubMenu("Edit"); subMenuEdit.add(Menu.NONE, IDM_CUT , Menu.NONE, "Cut"); subMenuEdit.add(Menu.NONE, IDM_COPY, Menu.NONE, "Copy"); subMenuEdit.add(Menu.NONE, IDM_PASTE, Menu.NONE, "Paste"); μενού. add(Menu.NONE, IDM_HELP, Menu.NONE, "Help"); return super.onCreateOptionsMenu(menu); ) @Override public boolean onOptionsItemSelected(MenuItem item) ( CharSequence message; switch (item.getItemId()) ( case IDM_NE : message = "Επιλέχτηκε νέο στοιχείο"; break; case IDM_OPEN: message = "Open item επιλεγμένο"; break; case IDM_SAVE: message = "Save item Selected"; break; case IDM_CUT: message = "Cut item Selected"; break; περίπτωση IDM_COPY:message= "Επιλέχτηκε αντιγραφή στοιχείου"; Διακοπή; case IDM_PASTE: message = "Επιλογή επικόλλησης"; Διακοπή; case IDM_HELP: message = "Επιλέχτηκε το στοιχείο βοήθειας"; Διακοπή; προεπιλογή: επιστροφή ψευδής; ) // εμφάνιση ειδοποίησης σχετικά με το επιλεγμένο στοιχείο μενού Toast toast = Toast.makeText(this, message, Toast.LENGTH_LONG); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); επιστροφή αληθινή? )

Τώρα, όταν επιλέγετε ένα στοιχείο μενού, θα εμφανιστεί ένα άλλο παράθυρο με υπομενού. Δοκιμάστε το μόνοι σας.

Προσθήκη πλαισίων ελέγχου και κουμπιών επιλογής

Μπορείτε να προσθέσετε πλαίσια ελέγχου ή κουμπιά επιλογής στα στοιχεία μενού. Για να προσθέσετε ένα πλαίσιο ελέγχου ή ένα κουμπί επιλογής για ένα μεμονωμένο στοιχείο μενού, πρέπει να χρησιμοποιήσετε τη μέθοδο setCheckable():

MenuItem item = menu.add(0, IDM_FORMAT_BOLD, 0, "Bold"); item.setCheckable(true);

Εάν χρειάζεται να προσθέσετε πολλά στοιχεία μενού με πλαίσια ελέγχου ή κουμπιά επιλογής, τότε μπορείτε να τα συνδυάσετε σε ομάδες μενού δημιουργώντας ένα ξεχωριστό αναγνωριστικό. Το στοιχείο μενού προστίθεται στην ομάδα μέσω της μεθόδου Προσθήκη(), περνώντας του το αναγνωριστικό της ομάδας μενού ως πρώτη παράμετρο. Ας υποθέσουμε ότι έχουμε δηλώσει αναγνωριστικά για την ομάδα μενού Χρώμα και τα στοιχεία μενού για να ορίσουμε το χρώμα:

Δημόσιο στατικό τελικό int IDM_COLOR_GROUP = 400; δημόσιο στατικό τελικό int IDM_COLOR_RED = 401; δημόσιο στατικό τελικό int IDM_COLOR_GREEN = 402; δημόσιο στατικό τελικό int IDM_COLOR_BLUE = 403;

Τώρα για να δημιουργήσετε μια ομάδα μενού με πλαίσια ελέγχου, πρέπει να αντιστοιχίσετε ένα αναγνωριστικό ομάδας σε κάθε στοιχείο μενού και να καλέσετε τη μέθοδο setGroupCheckable()για ολόκληρη την ομάδα (σε αυτήν την περίπτωση, δεν χρειάζεται να καλέσετε τη μέθοδο setCheckable()για κάθε στοιχείο μενού):

SubMenu subMenuColor = menu.addSubMenu("Color"); subMenuColor.add(IDM_COLOR_GROUP, IDM_COLOR_RED, Menu.NONE, "Red"); subMenuColor.add(IDM_COLOR_GROUP, IDM_COLOR_GREEN, Menu.NONE"Green"); subMenuColor.add(IDM_COLOR_GROUP, IDM_COLOR_BLUE, Menu.NONE, "Blue"); subMenuColor.setGroupCheckable(IDM_COLOR_GROUP, true, false);

Στη μέθοδο setGroupCheckable()τρεις επιλογές:

  • η πρώτη παράμετρος είναι το αναγνωριστικό της ομάδας μενού.
  • Η δεύτερη παράμετρος είναι αληθής εάν τα κουμπιά επιλογής ή τα πλαίσια ελέγχου επιτρέπονται στην ομάδα.
  • τρίτη παράμετρος - ορίζει μία (true) ή πολλαπλή (false) επιλογή των στοιχείων μενού. Αυτή η ρύθμιση καθορίζει στην πραγματικότητα την εμφάνιση του μενού - θα είναι ένα μενού με κουμπιά επιλογής ή πλαίσια ελέγχου.

    Για να ελέγξετε την κατάσταση των πλαισίων ελέγχου και των κουμπιών επιλογής στο πρόγραμμα χειρισμού συμβάντων επιλογής στοιχείων μενού, γράψτε τα εξής:

    @Override public boolean onOptionsItemSelected(MenuItem item) ( CharSequence message; switch (item.getItemId()) ( ... case IDM_COLOR_RED: // αντιστρέψτε την κατάσταση του πλαισίου ελέγχου item.setChecked(!item.isChecked()); μήνυμα = "Κόκκινο χρώμα"; σπάσιμο; προεπιλογή: επιστροφή ψευδής;)

    Εκτελέστε το έργο, καλέστε το μενού και επιλέξτε το στοιχείο μενού Χρώμα. Θα έχετε ένα υπομενού με τρία στοιχεία (Κόκκινο, Πράσινο, Μπλε) με τη μορφή σημαιών. Η κατάσταση των πλαισίων ελέγχου και των διακοπτών επεξεργάζεται στον κωδικό προγράμματος και αποθηκεύεται όταν καλείται ξανά το μενού.

    Μπορείτε να αντιστοιχίσετε αμέσως μια πρόθεση στο επιλεγμένο στοιχείο μενού μέσω της μεθόδου setIntent(), η οποία θα ενεργοποιηθεί όταν γίνει κλικ σε αυτό το στοιχείο, εάν αυτό το συμβάν δεν καταλήφθηκε από τους χειριστές onMenuItemClickListener (καταργήθηκε) ή onOptionsItemSelected. Μόλις ενεργοποιηθεί, το intent περνά στη μέθοδο startActivity.

    MenuItem.setIntent(new Intent(this, MyOtherActivity.class));

    Άνοιγμα ή κλείσιμο μενού μέσω προγραμματισμού

    Εάν για κάποιο λόγο πρέπει να ανοίξετε μέσω προγραμματισμού το μενού (για παράδειγμα, για λόγους επίδειξης), χρησιμοποιήστε τη μέθοδο openOptionsMenu():

    OpenOptionsMenu();

    Για να κλείσετε μέσω προγραμματισμού το μενού, χρησιμοποιήστε τη μέθοδο closeOptionsMenu(), ωστόσο, έχω μια επαναλαμβανόμενη κλήση στη μέθοδο openOptionsMenu()κλείνει επίσης το μενού.

    Κατάργηση μέσω προγραμματισμού ενός στοιχείου μενού

    Ας υποθέσουμε ότι ορίσαμε ένα στοιχείο μενού σε ένα αρχείο xml:

    Για να αφαιρέσουμε ένα προφανώς περιττό στοιχείο μενού από το πρόγραμμα γάτα μας, πρέπει να έχουμε πρόσβαση στο στοιχείο μενού μέσω της μεθόδου findItem()και να το κάνει αόρατο. Μια αναφορά στο αντικείμενο Μενού πρέπει να μεταβιβαστεί στη μέθοδο onCreateOptionsMenuώστε το πρόγραμμα να μάθει για την αλλαγή στη σύνθεση του μενού.

    // μεταβλητή κλάσης Μενού μενού; @Override public boolean onCreateOptionsMenu(μενού μενού) ( super.onCreateOptionsMenu(menu); // περάστε μια αναφορά στο αντικείμενο μας this.menu = μενού; getMenuInflater().inflate(R.menu.test, μενού); επιστροφή true; ) / / κάντε κλικ στο κουμπί δημόσιο κενό onClick(View v) ( if (menu != null) ( // βρείτε το επιθυμητό στοιχείο MenuItem item_dog = menu.findItem(R.id.action_dog); // κάντε το invisible item_dog.setVisible(false );))

    Αλλά αυτή την απόφασηυπάρχει ένα μειονέκτημα, αν περιστρέψουμε την οθόνη, η δραστηριότητα θα αναδημιουργηθεί και το απομακρυσμένο μενού θα εμφανιστεί ξανά. Πώς μπορούμε να απαλλαγούμε από τον άσχημο σκύλο;

    Πρέπει να θυμόμαστε την κατάσταση του στοιχείου μενού και να το αποθηκεύουμε σε ένα αντικείμενο τύπου Bundle στη μέθοδο onSaveInstanceState, και στη μέθοδο onCreate()ανάκτηση αποθηκευμένης κατάστασης και μετάβαση στη μέθοδο στο PrepareOptionsMenu, το οποίο καλείται πριν εμφανιστεί το μενού στην οθόνη:

    Πακέτο en.alexanderklimov.test; εισαγωγή android.app.Activity; εισαγωγή android.os.Bundle; εισαγωγή android.view.Menu; εισαγωγή android.view.MenuItem; εισαγωγή android.view.View; δημόσια κλάση TestActivity επεκτείνει τη Δραστηριότητα ( Μενού μενού; Boolean savedMenuDogIsVisible; τελική στατική συμβολοσειρά KEY_MENU_DOG = "KEY_MENU_DOG"; @Override public void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState) ( super.onCreate(savedInstanceSet./layout); Δεδομένα ορατότητας του στοιχείου μενού εάν (savedInstanceState != null) ( savedMenuDogIsVisible = savedInstanceState.getBoolean(KEY_MENU_DOG, true); ) ) @Override public boolean onCreateOptionsMenu(Menumenu) (super.numenumenu(get menu) ).inflate(R.menu.test, menu); return true; ) public void onClick(View v) ( if (menu != null) ( MenuItem item_dog = menu.findItem(R.id.action_dog); // hide στοιχείο μενού item_dog.setVisible(false); ) ) @Override protected void onSaveInstanceState(Bundle outState) ( // TODO Αυτόματη δημιουργία μεθόδου stub super.onSaveInstanceState(outState); if (menu != null) ( MenuItem. (R.id.action_dog); // αποθηκεύστε την τρέχουσα κατάσταση του στοιχείου μενού - true ή false outState.putBoolean(KEY_MENU_DOG, item_dog.isVisible()); ) ) @Override public boolean onPrepareOptionsMenu(μενού μενού) ( if (savedMenuDogIsVisible != null) ( MenuItem item_dog = menu.findItem(R.id.action_dog); // πριν εμφανιστεί η επιθυμητή κατάσταση του στοιχείου μενού item_dog.savedMenuog. ; ) επιστροφή super.onPrepareOptionsMenu(μενού); ) )

    Ανίχνευση παρουσίας κουμπιού Μενού

    Οι παλαιότερες συσκευές χρησιμοποιούσαν ένα πραγματικό κουμπί Μενού. Σε νέες εκδόσεις μενού androidαφαιρέθηκε στο ActionBar και η παρουσία του ως ξεχωριστού κουμπιού έγινε προαιρετική. Αλλά πολλοί κατασκευαστές εξακολουθούν να παράγουν τηλέφωνα με κουμπί μενού. Για να προσδιορίσετε εάν υπάρχει ένα τέτοιο κουμπί, προστέθηκε το Android 14 νέα μέθοδος, το οποίο θα καθορίσει την παρουσία αυτού του κουμπιού.

    Εάν (Build.VERSION.SDK_INT<= 10 || (Build.VERSION.SDK_INT >= 14 && ViewConfiguration.get(this) .hasPermanentMenuKey())) ( // το πλήκτρο μενού υπάρχει Toast.makeText(αυτό, "Κουμπί μενού είναι", Toast.LENGTH_LONG).show(); ) else ( // Χωρίς μενού πλήκτρο Toast.makeText(αυτό, "No Menu Button", Toast.LENGTH_LONG).show(); )

    Σήμανση για το μενού

    Στις σύγχρονες συσκευές, το μενού αποτελεί μέρος του ActionBar. Και μπορείτε να προσαρμόσετε τη διάταξη του μενού μέσω XML.

    Ας υποθέσουμε ότι επιλέξατε αυτήν την επιλογή:

    Στην ιδιότητα showAsActionμην χρησιμοποιείτε την τιμή ποτέ, διαφορετικά δεν θα δείτε τη σήμανση. Η ίδια η σήμανση καθορίζεται μέσω του χαρακτηριστικού actionLayout. Κωδικός σήμανσης:

    Μενού αποσπασματικά

    Ένα μενού μπορεί να είναι όχι μόνο μέρος μιας δραστηριότητας, αλλά και μέρος ενός τμήματος. Η αρχή λειτουργίας είναι πρακτικά η ίδια. Το θραύσμα έχει αντίστοιχη μέθοδο.

    @Override public void onCreateOptionsMenu(μενού μενού, MenuInflater inflater) ( super.onCreateOptionsMenu(μενού, inflater); inflater.inflate(R.menu.fragment_crime_list, μενού); )

    FragmentManagerυπεύθυνος για την κλήση onCreateOptionsMenu()όταν η δραστηριότητα λαμβάνει μια επανάκληση onCreateOptionsMenu()από το σύστημα. Πρέπει να το πείτε ρητά στον διευθυντή FragmentManagerότι το κομμάτι πρέπει να κληθεί onCreateOptionsMenu(). Για αυτό, η μέθοδος ονομάζεται setHasOptionsMenu():

    // Στον κωδικό τμήματος @Override δημόσιο κενό onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); setHasOptionsMenu(true); getActivity().setTitle(R.string.cat); ...)

Πριν από το Honeycomb (Android 3.0), όλες οι συσκευές Android είχαν ένα κουμπί "μενού" κάτω από την οθόνη. Οι προγραμματιστές μπορούσαν να το χρησιμοποιήσουν όπως τους βολεύει και οι διεπαφές πολλών εφαρμογών δημιουργήθηκαν γύρω από αυτό το κουμπί. Το Honeycomb προσανατολισμένο σε tablet έχει κάνει ένα βήμα μακριά από τα μηχανικά (και αφής) κουμπιά, και από αυτή την άποψη, στο τρίτο εκδόσεις androidεμφανίστηκε η κλάση ActionBar, η οποία έδωσε τη δυνατότητα στον χρήστη γρήγορη πρόσβασηστις ρυθμίσεις της εφαρμογής μέσω ενός ειδικού πίνακα που ονομάζεται γραμμή ενεργειών. Σύμφωνα με Google DevelopersΗ γραμμή δράσης είναι το μέλλον και οι προγραμματιστές θα πρέπει να σταματήσουν να χρησιμοποιούν το κουμπί "μενού". Στην αγορά κυριαρχούν σήμερα τα smartphones με μηχανικά ή κουμπί αφήςκάτω από την οθόνη, αλλά με την έλευση του Ice Cream Sandwich, η κατάσταση μπορεί να αλλάξει δραματικά. Είναι σημαντικό για εσάς, ως προγραμματιστή, να προετοιμαστείτε εκ των προτέρων για την εμφάνιση τέτοιων συσκευών και να χρησιμοποιήσετε την έννοια της γραμμής δράσης σήμερα.

Με την πρώτη ματιά, μπορεί να φαίνεται ότι η χρήση της γραμμής ενεργειών θα προκαλέσει προβλήματα κατά την ανάπτυξη προγραμμάτων για το Android 2.x, στο οποίο αυτή η γραμμή δεν έχει ακόμη εφαρμοστεί. Ωστόσο, εδώ δεν υπάρχει πρόβλημα. Κανείς δεν σας απαγορεύει να συνεχίσετε να χρησιμοποιείτε το κουμπί "μενού" σε εκείνες τις συσκευές όπου υπάρχει, η προσθήκη μιας γραμμής ενεργειών θα απαιτήσει από εσάς να γράψετε μόνο μερικές γραμμές κώδικα.

Αν προσπαθούσα να συμπυκνώσω αυτό το άρθρο σε μία πρόταση, θα ήταν: " Ορίστε το targetSdkVersion σε 14 και προσθέστε ετικέτα showAsAction="ifRoom" στα στοιχεία μενού που πρέπει να αποδοθούν στη γραμμή ενεργειών".

Η τελική απόρριψη του μενού ρυθμίσεων στο Android

Δεν αρκεί απλώς να σταματήσετε να χρησιμοποιείτε το κουμπί "μενού", πρέπει να βγάλετε εντελώς την ιδέα από το μυαλό σας. Μην δημιουργείτε μενού, δημιουργήστε όλα τα απαραίτητα κουμπιά απευθείας μέσα στις δραστηριότητες. Εάν ορισμένες ενέργειες δεν χωρούν στον πίνακα, τοποθετήστε τις σε ένα επιπλέον αναπτυσσόμενο μενού (υπερχείλιση ενέργειας). Η παραπάνω εικόνα δείχνει μια γραμμή ενεργειών με ένα κουμπί αναζήτησης και ένα πρόσθετο μενού στη δεξιά πλευρά της γραμμής.

Εάν η αίτησή σας έχει κατασκευαστεί για παλιά εκδοχή android (το οποίο χρησιμοποιεί παραδοσιακά ένα μενού), στη συνέχεια, όταν εκκινηθεί σε tablet Android 3, θα εμφανιστεί ένας πίνακας στο κάτω μέρος της οθόνης που μιμείται τα τρία κουμπιά που υπάρχουν στα τηλέφωνα του δεύτερου κλάδου.

Η ορολογία είναι αρκετά συγκεχυμένη, αλλά το αναπτυσσόμενο μενού (υπερχείλιση ενεργειών) προτείνει μια εντελώς διαφορετική έννοια χρήσης από ένα απλό μενού ρυθμίσεων. Αντί να σκέφτεστε ένα μενού ως χώρο αποθήκευσης για όλες τις ρυθμίσεις της εφαρμογής, δημιουργείτε έναν πίνακα όπου βάζετε τις κύριες ρυθμίσεις. Οτιδήποτε δευτερεύον αφαιρείται σε ένα αναπτυσσόμενο μενού, το οποίο καλείται όταν κάνετε κλικ στο κουμπί με τρεις τελείες (κουμπί υπερχείλισης ενέργειας) στη δεξιά πλευρά του πίνακα.

κουμπί υπερχείλισης δράσης

Εάν έχετε εκτελέσει εφαρμογές γραμμένες για Android 2.3 και νεότερες εκδόσεις σε συσκευές χωρίς κουμπιά κάτω από την οθόνη (για παράδειγμα, σε tablet με Honeycomb ή σε Galaxy Nexus), ίσως έχετε παρατηρήσει ότι εμφανίζεται ένα κουμπί υπερχείλισης Action δίπλα στην εικόνα του τρία κουμπιά στον πίνακα στο κάτω μέρος (τρεις κουκκίδες το ένα πάνω στο άλλο). Αυτός είναι ένας συμβιβασμός, αλλά όχι πολύ καλός. Σε εφαρμογές που δεν χρησιμοποιούν καθόλου το μενού ρυθμίσεων, αυτό το κουμπί δεν κάνει τίποτα, ενοχλώντας τους χρήστες. Επομένως, μια πολύ καλή λύση θα ήταν να ακολουθήσει έκδοση android, και εάν το πρόγραμμά σας εκτελείται με Android 3.0+, αφαιρέστε αυτό το κουμπί από τη γραμμή πλοήγησης και χρησιμοποιήστε τη γραμμή ενεργειών. Αυτή η προσέγγιση σάς επιτρέπει να διατηρείτε το πρόγραμμα συμβατό με παλιές συσκευές και να το κάνετε πιο ελκυστικό για τις νέες.

Εάν το πρόγραμμά σας εκτελείται σε συσκευές χωρίς κουμπιά, το σύστημα αποφασίζει εάν θα προσθέσει υπερχείλιση ενεργειών στη γραμμή πλοήγησης ανάλογα με την τιμή του πεδίου στο μανιφέστο. Η λογική είναι η εξής

  • Εάν ορίσετε το minSdkVersion ή το targetSdkVersion σε τιμή μεγαλύτερη από 11, τότε το σύστημα δεν προσθέτει αυτό το κουμπί.
  • Από την άλλη πλευρά, το σύστημα δημιουργεί αυτό το κουμπί όταν εκτελείτε την εφαρμογή σε Android 3.0 και νεότερη έκδοση.
  • Η μόνη εξαίρεση είναι όταν ορίζετε το minSdkVersion σε 10 ή χαμηλότερο. targetSdkVersion σε 11, 12 ή 13 και δεν θα χρησιμοποιεί το ActionBar, το σύστημα θα προσθέσει αυτό το κουμπί σε τηλέφωνα (όχι tablet) κάτω από Έλεγχος Android 4.0 και άνω. Αυτή η εξαίρεση βασίζεται στην ακόλουθη ιδέα: εάν αναπτύσσετε μια εφαρμογή για τηλέφωνα του δεύτερου κλάδου και για tablet του τρίτου, τότε υποθέτετε ότι τα τηλέφωνα πρέπει να έχουν κουμπί μενού, αλλά τα tablet όχι.

Επομένως, εάν θέλετε να απενεργοποιήσετε την ενέργεια υπερχείλισης ενός κουμπιού στη γραμμή πλοήγησης, πρέπει να ορίσετε το targetSdkVersion σε 14 (το minSdkVersion μπορεί να οριστεί σε περισσότερο από χαμηλής αξίαςώστε το πρόγραμμα να μπορεί να τρέχει σε παλαιότερες συσκευές).

Μετάβαση στην έννοια της γραμμής δράσης

Εάν έχετε δραστηριότητες που χρησιμοποιούν το μενού επιλογών (δημιουργήθηκαν με onCreateOptionsMenu()), τότε αφαιρώντας το κουμπί από τη γραμμή πλοήγησης (ορίζοντας targetSdkVersion=14) θα πρέπει να παρέχετε στον χρήστη ένα εναλλακτικό μέσο πρόσβασης στις επιλογές. Ευτυχώς, δεν χρειάζεται να κάνετε πολλή δουλειά γιατί το σύστημα δημιουργεί αυτόματα μια γραμμή ενεργειών.

Προσθέστε showAsAction="ifRoom" στις ετικέτες σας τα στοιχεία που θέλετε να βάλετε στη γραμμή ενεργειών. Εάν δεν είστε σίγουροι ποιο στοιχείο να συμπεριλάβετε σε μια γραμμή ενεργειών, ανατρέξτε στον οδηγό της γραμμής ενεργειών του Android Design .

Για να κάνετε την αντίληψη του προγράμματός σας πιο ολιστική, σας συνιστούμε να χρησιμοποιήσετε εικονίδια από Ομάδα Android UX. Αρχείο .

Πώς να αφαιρέσετε τη γραμμή ενεργειών από την εφαρμογή Android

Εάν δεν χρειάζεστε τη γραμμή ενεργειών, μπορείτε να την αφαιρέσετε από οποιαδήποτε δραστηριότητα ή ακόμα και από την εφαρμογή. Αυτό μπορεί να σχετίζεται με παιχνίδια και προγράμματα που δεν χρησιμοποιούν το μενού ρυθμίσεων. Μπορείτε να αφαιρέσετε τη γραμμή ενεργειών χρησιμοποιώντας το θέμα Theme.Holo.NoActionBar ή Theme.DeviceDefault.NoActionBar.

Εάν θέλετε να χρησιμοποιήσετε αυτά τα σχήματα, αλλά διατηρήστε συμβατό προς τα πίσω, μπορείτε να χρησιμοποιήσετε το σύστημα διαχείρισης πόρων για να ορίσετε διαφορετικά θέματα διαφορετικές εκδόσειςπλατφόρμες. Αυτό το θέμα καλύπτεται με περισσότερες λεπτομέρειες εδώ. Θα χρειαστεί να δημιουργήσετε το δικό σας θέμα που θα κληρονομείται από θέματα διάφορες πλατφόρμεςανάλογα με την τρέχουσα έκδοση.

Για παράδειγμα, μπορείτε να δηλώσετε ένα θέμα για την αίτησή σας

(ή για μια συγκεκριμένη δραστηριότητα σε μια ετικέτα ).

Για συσκευές με Android 2, συμπεριλάβετε το παρακάτω θέμα στο res/values/themes.xml.



Για το Honeycomb, συμπεριλάβετε το παρακάτω θέμα στο res/values-v11/themes.xml.



Κατά την εκκίνηση, ανάλογα με την έκδοση του API, το σύστημα θα επιλέξει το κατάλληλο θέμα.

συμπέρασμα

Ας ανακεφαλαιώσουμε τις βασικές ιδέες και σημεία του άρθρου:

  • Στο νέο AndroidΟι συσκευές μπορεί να μην έχουν κουμπί "μενού", επομένως κατά την ανάπτυξη προγραμμάτων, είναι καλύτερο να μην το χρησιμοποιείτε καθόλου.
  • Ορίστε targetSdkVersion = 14 και δοκιμάστε την εφαρμογή σας στο Android 4.0.
  • Προσθέστε την ετικέτα showAsAction="ifRoom" σε ένα στοιχείο μενού εάν θέλετε να μεταβεί αυτόματα στη γραμμή ενεργειών.
  • Εάν η εφαρμογή σας δεν χρησιμοποιεί ActionBar, μπορείτε να την καταργήσετε χρησιμοποιώντας θέματα Theme.Holo.NoActionBar και Theme.DeviceDefault.NoActionBar.

Το Android υποστηρίζει διάφορους τύπους μενού. Πρώτον - υπάρχει ένα ξεχωριστό κουμπί στο τηλέφωνο Μενού(σε παλαιότερα τηλέφωνα), πατώντας το οποίο εμφανίζεται το μενού. Σε νέες συσκευές, αφαιρέθηκε ένα ξεχωριστό κουμπί, αντικαθιστώντας το με ένα εικονίδιο μενού τρίακουκκίδες σε κάθετο προσανατολισμό. Ο δεύτερος τύπος είναι ένα μενού περιβάλλοντος που εμφανίζεται όταν πατάτε παρατεταμένα το δάχτυλό σας στην οθόνη σωστό μέρος(Μπορείτε επίσης να πατήσετε παρατεταμένα το κεντρικό κουμπί στο τηλέφωνό σας). Κατάλογος συμφραζόμενωνμε τη σειρά του μπορεί να έχει ένα υπομενού. Σήμερα θα εξοικειωθούμε με τον πρώτο τύπο μενού. Αυτό το άρθρο θα καλύψει την εργασία με το μενού σε νέες συσκευές με Android 4.0 και νεότερη έκδοση.

Σε πρότυπο κενή δραστηριότηταδεν υπάρχει μενού, οπότε θα το δημιουργήσουμε μόνοι μας. Αυτό θα σας βοηθήσει να κατανοήσετε πώς λειτουργεί και να πάρετε μια γενική ιδέα για το έργο. Δεν είναι απαραίτητο να απομνημονεύσετε τα ονόματα των κλάσεων, των μεθόδων και του κώδικα για το χειρισμό της επιλογής των στοιχείων μενού. Σε άλλα πρότυπα, το μενού θα είναι ενσωματωμένο και μπορείτε να το χρησιμοποιήσετε αμέσως.

Δημιουργώ νέο έργομε βάση κενή δραστηριότητακαι τρέξε το. Δεν υπάρχει ακόμα μενού.

Δημιουργήστε πολλαπλούς πόρους συμβολοσειρών σε ένα αρχείο res/values/strings.xml, το οποίο θα είναι υπεύθυνο για τα στοιχεία μενού:

Ρυθμίσεις Γάτα Γάτα Γατούλα

Τώρα δημιουργήστε έναν νέο φάκελο μενούσε φάκελο res res, | Νέος | Ευρετήριο). Στη συνέχεια, δημιουργήστε ένα αρχείο στον δημιουργημένο φάκελο menu_main.xml- το όνομα υποδηλώνει ότι το μενού ανήκει στην κύρια δραστηριότητα Κύρια δραστηριότητα(δεξί κλικ στον φάκελο μενού | Νέος | Μενού Αρχείο πόρων). Εάν δημιουργήσετε μια εφαρμογή με πολλές οθόνες, τότε κάθε δραστηριότητα θα έχει ξεχωριστό μενού με τις δικές της ρυθμίσεις. Κατά το άνοιγμα του αρχείου menu_main.xmlκαι προσθέστε τον κώδικά μας στο πρότυπο που προκύπτει:

Ας ανοίξουμε το αρχείο Κύρια δραστηριότητα. Αυτή τη στιγμή έχει μόνο μία μέθοδο. onCreate(). Ας προσθέσουμε μια νέα μέθοδο onCreateOptionsMenu(). Ακριβώς αυτή τη μέθοδοείναι υπεύθυνος για την εμφάνιση του μενού στη δραστηριότητα. Επιλέξτε από το μενού στούντιο Κώδικας| και στο επόμενο παράθυρο, αρχίστε να πληκτρολογείτε το όνομα της μεθόδου με τα πρώτα γράμματα. Μπορεί να εισαχθεί πρώτα κεφαλαία γράμματα, δηλ. ocom( ο n ντοτιμή Οεπιλογές Μ enu) για να βρείτε γρήγορα την επιθυμητή συμβολοσειρά. Πατάμε το κουμπί Εντάξεικαι παίρνουμε το τεμάχιο εργασίας.

@Override public boolean onCreateOptionsMenu(μενού μενού) (επιστροφή super.onCreateOptionsMenu(μενού); )

Προσθέτουμε μια μέθοδο στην προετοιμασία που λαμβάνει δεδομένα από πόρους μενού και τα μετατρέπει σε στοιχεία μενού στην οθόνη.

@Override public boolean onCreateOptionsMenu(μενού μενού) ( getMenuInflater().inflate(R.menu.menu_main, μενού); επιστροφή true; )

Στη μέθοδο φουσκώνω()δείχνετε έναν πόρο μενού ( R.menu.menu_main) και αντικείμενο κλάσης Μενού.

Στα αγγλικά, το "inflate" μεταφράζεται ως inflate, δηλ. από το σχεδιασμό προγραμματιστές android, διογκώνουμε ένα αντικείμενο με δεδομένα, για παράδειγμα, ένα μενού. Στην πραγματικότητα όμως η λέξη «φουσκώνω» προέρχεται από τη φράση διαμέρισμα- στο διαμέρισμα. Υπάρχει μια παλιά παράδοση να ρίχνουν την πρώτη γάτα στο διαμέρισμα, η οποία εξερευνά όλες τις γωνιές και τις γωνίες του σπιτιού και δηλώνει τη συγκατάθεσή της να ζήσει σε αυτό. Έτσι εκτελούμε τα δεδομένα από το αρχείο XML στο αντικείμενο MenuInflater.

Εκτελέστε το έργο. Τώρα στη δεξιά πλευρά της κεφαλίδας θα δείτε ένα εικονίδιο με τρεις κουκκίδες σε διάταξη κάθετη γραμμή. Κάντε κλικ στο εικονίδιο για να δείτε το στοιχείο μενού Ρυθμίσεις.

Όπως δεν είναι δύσκολο να μαντέψει κανείς, το στοιχείο είδοςείναι υπεύθυνο για ένα ξεχωριστό στοιχείο μενού. Ας προσθέσουμε τρία ακόμη στοιχεία με τον ίδιο τρόπο, αλλάζοντας μόνο το αναγνωριστικό και το κείμενο για το μενού:

Εκτελέστε το έργο και δοκιμάστε να εμφανίσετε ξανά το μενού. Θα δείτε τρία νέα στοιχεία.

Επιλογές ταυτότητακαι τίτλοςδεν χρειάζονται εξηγήσεις. Παράμετρος παραγγελίαΣτηνΚατηγορίασας επιτρέπει να ορίσετε τη δική σας σειρά εμφάνισης των στοιχείων μενού. Ας υποθέσουμε ότι έχετε δημιουργήσει πέντε στοιχεία μενού, αλλά δεν έχετε αποφασίσει ακόμη τη σειρά με την οποία εμφανίζονται στην οθόνη. Για να μην μετακινούνται συνεχώς ολόκληρα μπλοκ κώδικα για στοιχεία μενού σωστή σειρά, μπορείτε να χρησιμοποιήσετε αυτήν την επιλογή.

Και τέλος, ένα σημαντικό χαρακτηριστικό app:showAsActionκαθορίζει τη συμπεριφορά του μενού στο ActionBar. Εννοια ποτέσημαίνει ότι το στοιχείο μενού δεν πρέπει να εμφανίζεται στην κεφαλίδα, αλλά μόνο στο αναδυόμενο μενού, π.χ. να είναι πίσω από τις τρεις τελείες. Εάν ορίσετε την τιμή πάντα, μετά το σημείο Ρυθμίσειςθα εμφανιστεί αμέσως στην κεφαλίδα της αίτησής σας. Επίσης διαθέσιμες τιμές ifRooms, με Κείμενοκαι collapseActionView. Δοκιμάστε το μόνοι σας. Για παράδειγμα, ifRoomΕμφανίζει ένα στοιχείο μενού εάν το επιτρέπει ο χώρος. Αν υπάρχουν πολλοί πόντοι, τότε μόνο εμπόδιο θα είναι. Κατά κανόνα, αυτή η επιλογή εμφανίζει μια πολύ σύντομη λέξη ή εικονίδιο για συχνές λειτουργίες, προκειμένου να αποφευχθούν περιττά κλικ σε τρεις τελείες.

Παρατηρήστε την ιδιότητα app:showAsAction, που ανήκει στον χώρο ονομάτων xmlns:app="http://schemas.android.com/apk/res-auto". Υπήρξε μια εποχή που δεν υπήρχε τέτοιος χώρος ονομάτων και τα έργα χρησιμοποιούσαν το χαρακτηριστικό android:showAsActionαπό τον τυπικό χώρο ονομάτων. Εάν το στούντιο ορκιστεί για το σφάλμα, τότε επεξεργαστείτε τον κωδικό.

Μέχρι να εκτελεστούν τα στοιχεία μενού χρήσιμη εργασία. Κάθε κλικ στο στοιχείο απλώς κλείνει το μενού χωρίς ορατές συνέπειες. Δεν έχουμε γράψει ακόμα τον κώδικα για τη διαχείριση των κλικ.

Επιλογή στοιχείων μενού

Μάθαμε πώς να δημιουργούμε ένα μενού. Αλλά μέχρι στιγμής είναι άχρηστο, αφού τα στοιχεία του μενού δεν αντιδρούν με κανέναν τρόπο στα κλικ μας. Μια άλλη μέθοδος χρησιμοποιείται για τον χειρισμό των κλικ μενού. onOptionsItemSelected(). Ας προσθέσουμε μια μέθοδο με τον ίδιο τρόπο όπως στο προηγούμενο παράδειγμα. Ας πάρουμε την προετοιμασία.

@Override public boolean onOptionsItemSelected(MenuItem item) (επιστροφή super.onOptionsItemSelected(item); )

Παράμετρος είδοςυπεύθυνος για το στοιχείο μενού. Θα πρέπει να λάβετε το αναγνωριστικό μενού μέσω της μεθόδου getItemId()και εισάγετε έναν κωδικό για αυτό. Δεδομένου ότι το μενού αποτελείται συνήθως από πολλά στοιχεία, είναι βολικό να χρησιμοποιήσετε τις κατασκευές αν/αλλιώςή διακόπτης. Για να εμφανίσουμε πληροφορίες, χρησιμοποιούμε μια ετικέτα κειμένου. Προσθέστε ένα στοιχείο στην οθόνη δραστηριότητας προβολή κειμένου. Μπορείτε να χρησιμοποιήσετε το υπάρχον προβολή κειμένουμε την ένδειξη "Hello World!", απλά δώστε του μια ταυτότητα.

android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!"/>

Ας προσθέσουμε τον κωδικό στο κενό για το επιλεγμένο στοιχείο μενού:

@Override public boolean onOptionsItemSelected(MenuItem item) ( // Λήψη του αναγνωριστικού του επιλεγμένου στοιχείου μενού int id = item.getItemId(); TextView infoTextView = (TextView) findViewById(R.id.textView); // Λειτουργίες για το επιλεγμένο διακόπτης στοιχείου μενού ( id) ( case R.id.action_cat1: infoTextView.setText("Επιλέξατε μια γάτα!"); επιστροφή true; case R.id.action_cat2: infoTextView.setText("Επιλέξατε μια γάτα!"); επιστροφή true; case R. id.action_cat3: infoTextView.setText("Έχετε επιλέξει ένα γατάκι!"); επιστροφή true; προεπιλογή: επιστροφή super.onOptionsItemSelected(item); ) )

Εκτελέστε την εφαρμογή, καλέστε το μενού και επιλέξτε οποιοδήποτε στοιχείο μενού. Θα πρέπει να εμφανιστεί ένα μήνυμα στο πλαίσιο κειμένου.

Υπάρχει εναλλακτικό τρόπομέσω XML παρόμοιο με το χειρισμό των κλικ κουμπιών (από το Android 3.0). Μπορείτε να προσθέσετε χαρακτηριστικό android:onclickστους πόρους του μενού και δεν χρειάζεται να χρησιμοποιήσετε κλήση μεθόδου onOptionsItemSelected(). Με βοήθεια android:onclickμπορείτε να καθορίσετε την επιθυμητή μέθοδο όταν επιλέγετε ένα στοιχείο μενού. Προσθέστε αυτό το χαρακτηριστικό στο στοιχείο Ρυθμίσεις

Τώρα στον κωδικό δραστηριότητας θα γράψουμε τα εξής:

// το χαρακτηριστικό στοιχείο μενού Ρυθμίσεις έχει οριστεί σε android:onClick="onSettingsMenuClick" δημόσιο κενό onSettingsMenuClick(Στοιχείο MenuItem) ( TextView infoTextView = (TextView) findViewById(R.id.textView); infoTextView. καλύτερα θα διάλεγα μια γάτα");)

Διακόπτες

Η εμφάνιση των στοιχείων μενού μπορεί να αλλάξει σε προβολή με κουμπιά επιλογής. Για να το κάνετε αυτό, προσθέστε ένα στοιχείο ομάδαμε χαρακτηριστικό android:checkableBehavior="single":

Δεν βλέπω πολύ νόημα σε αυτή τη λειτουργία. Και δεν θα το εξετάσουμε.

Λειτουργία σχεδίασης

Το Android Studio 2.2 πρόσθεσε μια λειτουργία δημιουργίας γραφικού μενού που μοιάζει με γραμμή εργαλείων για την προσθήκη νέων στοιχείων στην οθόνη. Η γραμμή μενού αποτελείται από τέσσερα στοιχεία: Στοιχείο μενού, Αναζήτηση αντικειμένου, Μενού, ομάδα.

Η αρχή είναι η ίδια, επιλέξτε το επιθυμητό στοιχείο και σύρετέ το στην οθόνη στην περιοχή μενού. Εάν έχετε μάθει να δημιουργείτε χειροκίνητα ένα μενού, τότε με αυτόν τον τρόποδεν θα σας δημιουργήσει κανένα πρόβλημα. Με αυτό, μπορείτε να σχεδιάσετε γρήγορα τη δομή του μενού και, στη συνέχεια, να το τροποποιήσετε χειροκίνητα.