Με τα χρόνια έχω δει διαφορετικές εφαρμογές του μοτίβου πλοήγησης Android. Ορισμένες εφαρμογές χρησιμοποίησαν μόνο Δραστηριότητες, ενώ άλλες Δραστηριότητες αναμίχθηκαν με Αποσπάσματα ή / και Προσαρμοσμένες προβολές ( Προσαρμοσμένες προβολές ).
Μία από τις αγαπημένες μου εφαρμογές μοτίβων θραυσμάτων βασίζεται στη φιλοσοφία «One-Activity-Multiple-Fragments» (« Μία Δραστηριότητα-Πολλαπλά Θραύσματα '), Ή απλά το Fragment Navigation Pattern ( Μοτίβο πλοήγησης θραυσμάτων ), όπου κάθε οθόνη στην εφαρμογή είναι ένα πλήρες τμήμα Fragment και όλα ή τα περισσότερα από αυτά τα τμήματα βρίσκονται σε μια δραστηριότητα.
Αυτή η προσέγγιση όχι μόνο απλοποιεί τον τρόπο εφαρμογής της πλοήγησης, αλλά έχει και καλύτερη απόδοση και ως εκ τούτου σας προσφέρει μια καλύτερη εμπειρία χρήστη.
Σε αυτό το άρθρο θα διερευνήσουμε ορισμένες κοινές εφαρμογές μοτίβου πλοήγησης στο Android και, στη συνέχεια, θα παρουσιάσουμε το μοτίβο πλοήγησης με βάση το απόσπασμα. Μπορείτε να βρείτε ένα δείγμα εφαρμογής που εφαρμόζει αυτό το μοτίβο GitHub .
Μια τυπική εφαρμογή Android που χρησιμοποιεί μόνο δραστηριότητες οργανώνεται σε μια δομή τύπου δέντρου (ακριβώς σε ένα κατευθυνόμενο γράφημα) όπου η κύρια δραστηριότητα ξεκινά από το προωθητής . Κατά την περιήγηση στην εφαρμογή υπάρχει ένα « πίσω στοίβα Από τη δραστηριότητα που διατηρείται χάρη στο λειτουργικό σύστημα.
Ένα απλό παράδειγμα φαίνεται στο ακόλουθο διάγραμμα:
Η Δραστηριότητα Α1 είναι το σημείο εισόδου της εφαρμογής μας (για παράδειγμα, αντιπροσωπεύει μια αρχική οθόνη ή ένα κύριο μενού) και από εκείνο το σημείο ο χρήστης μπορεί να πλοηγηθεί σε Α2 ή Α3. Όταν πρέπει να επικοινωνείτε μεταξύ των δραστηριοτήτων που μπορείτε να χρησιμοποιήσετε startActivityForResult () Ή θα μπορούσατε να μοιραστείτε ένα παγκόσμιο προσβάσιμο λογικό αντικείμενο μεταξύ των δύο δραστηριοτήτων.
Όταν πρέπει να προσθέσετε μια νέα δραστηριότητα πρέπει να ακολουθήσετε τα ακόλουθα βήματα:
Αν και αυτό το διάγραμμα πλοήγησης είναι μια αρκετά απλοποιημένη προσέγγιση. αλλά μπορεί να γίνει πολύ περίπλοκο όταν χρειάζεστε χειραγώγηση του πίσω στοίβα ή όταν πρέπει να επαναχρησιμοποιήσετε την ίδια δραστηριότητα αρκετές φορές, για παράδειγμα όταν θέλετε ο χρήστης να περιηγηθεί σε διαφορετικές οθόνες φροντιστηρίου, αλλά κάθε οθόνη χρησιμοποιεί την ίδια δραστηριότητα ως βάση.
Ευτυχώς διαθέτουμε εργαλεία για αυτές τις περιπτώσεις μικροδουλειές και μερικούς οδηγούς για ένα πλοήγηση του πίσω στοίβα κατάλληλος .
τι μπορούν να κάνουν τα discord bots
Στη συνέχεια, με το API επίπεδο 11, τα κομμάτια έφτασαν ...
Το Android εισάγει αποσπάσματα στο Android 3.0 (API επίπεδο 11), κυρίως για την υποστήριξη πιο δυναμικών και ευέλικτων διατάξεων διεπαφής χρήστη σε μεγάλες οθόνες, όπως tablet. Δεδομένου ότι η οθόνη ενός tablet είναι πολύ μεγαλύτερη από αυτήν του τηλεφώνου, υπάρχει περισσότερος χώρος για να συνδυάσετε και να ταιριάξετε τα στοιχεία του περιβάλλοντος εργασίας χρήστη. Τα αποσπάσματα υποστηρίζουν αυτές τις διατάξεις χωρίς να χρειάζεται να διαχειρίζεστε σύνθετες αλλαγές στην ιεραρχία προβολών. Χωρίζοντας το σχεδιασμό μιας δραστηριότητας σε κομμάτια, μπορείτε να τροποποιήσετε την εμφάνιση της δραστηριότητας κατά το χρόνο εκτέλεσης και να διατηρήσετε αυτές τις αλλαγές σε μια στοίβα δραστηριότητας που διαχειρίζεται η δραστηριότητα. - απόσπασμα από τον Οδηγό Google API για θραύσματα .
Αυτό το νέο παιχνίδι επέτρεψε στους προγραμματιστές να δημιουργήσουν ένα περιβάλλον εργασίας χρήστη πολλαπλών πινάκων και να μπορούν να επαναχρησιμοποιήσουν τα στοιχεία σε άλλες δραστηριότητες. Μερικοί προγραμματιστές το λατρεύουν αυτό, ενώ άλλοι Οχι τόσο πολύ . Το αν θα χρησιμοποιηθεί ή όχι το Snippets είναι μια δημοφιλής συζήτηση, αλλά νομίζω ότι όλοι θα συμφωνήσουν ότι τα αποσπάσματα έφεραν επιπλέον πολυπλοκότητα και οι προγραμματιστές πρέπει να τα κατανοήσουν σωστά για να τα χρησιμοποιήσουν.
Άρχισα να βλέπω όλο και περισσότερα παραδείγματα όπου τα αποσπάσματα όχι μόνο αντιπροσώπευαν ένα μέρος της οθόνης, αλλά ολόκληρη η οθόνη ήταν ένα απόσπασμα σε μια δραστηριότητα. Υπήρχε μια στιγμή που είδα μια διάταξη όπου κάθε δραστηριότητα είχε ακριβώς ένα απόσπασμα πλήρους οθόνης και τίποτα άλλο, και ο μόνος λόγος που υπήρχαν αυτές οι δραστηριότητες ήταν να αποθηκεύσουν τα αποσπάσματα. Εκτός από το ελάττωμα του σχεδιασμού, υπάρχει ένα άλλο πρόβλημα με αυτήν την προσέγγιση. Ρίξτε μια ματιά στο παρακάτω διάγραμμα:
Πώς μπορεί το A1 να επικοινωνήσει με το F1; Αυτό που συμβαίνει είναι ότι ο Α1 έχει τον πλήρη έλεγχο του F1, επειδή δημιούργησε το F1. Το A1 θα μπορούσε να περάσει ένα πακέτο, για παράδειγμα, στη δημιουργία του F1 ή μπορεί να επικαλεστεί τις δημόσιες μεθόδους του. Πώς μπορεί το F1 να επικοινωνεί με το A1; Λοιπόν αυτό είναι πιο περίπλοκο, μπορεί να λυθεί με ένα μοτίβο επιστροφή κλήσης / παρατηρητής όπου ο Α1 εγγράφεται στο F1 και ο F1 ειδοποιεί το A1.
Αλλά πώς μπορούν να επικοινωνήσουν οι Α1 και Α2; Όπως εξηγήθηκε παραπάνω, θα μπορούσαν να επικοινωνήσουν μέσω startActivityForResult () .
Και τώρα η πραγματική ερώτηση: Πώς μπορούν να επικοινωνούν τα F1 και F2; Ακόμη και σε αυτήν την περίπτωση μπορούμε να έχουμε ένα επιχειρησιακό λογικό στοιχείο που είναι παγκοσμίως προσβάσιμο και μπορεί να χρησιμοποιηθεί για τη διαβίβαση δεδομένων. Αλλά αυτό το στοιχείο δεν ταιριάζει πάντα με το φανταχτερό σχέδιο. Τι γίνεται αν το F2 πρέπει να μεταδώσει πληροφορίες στο F1 πιο άμεσα; Σε μια τέτοια περίπτωση, με μοτίβο επανάκληση Το F2 μπορεί να ειδοποιήσει το A2, τότε το A2 καταλήγει σε ένα αποτέλεσμα και το αποτέλεσμα μπορεί να αποθηκευτεί από τον Α1 που μπορεί να ειδοποιήσει το F1.
Αυτή η προσέγγιση απαιτεί πολύ κώδικα βραστήρα και γρήγορα γίνεται πηγή σφάλματα , πόνο και θυμό.
Τι γίνεται αν μπορούσαμε να απαλλαγούμε από όλες τις δραστηριότητες και να κρατήσουμε μόνο μία από αυτές που θα διατηρήσει τα υπόλοιπα θραύσματα;
ποιες είναι οι αρχές της γραφιστικής
Με την πάροδο του χρόνου άρχισα να χρησιμοποιώ το μοτίβο 'One-Activity-Multiple-Fragments' στις περισσότερες από τις εφαρμογές μου και εξακολουθώ να το χρησιμοποιώ. Υπάρχουν πολλές συζητήσεις εκεί έξω για αυτήν την προσέγγιση ή φιλοσοφία, για παράδειγμα εδώ Υ εδώ . Αυτό που μου έλειψε ήταν ένα συγκεκριμένο παράδειγμα που μπορώ να δω και να δοκιμάσω για τον εαυτό μου.
Ας δούμε το παρακάτω διάγραμμα για μια στιγμή:
Τώρα έχουμε μόνο μία δραστηριότητα κοντέινερ και έχουμε πολλά θραύσματα που βρίσκονται ξανά σε μια δομή τύπου δέντρου. Η πλοήγηση μεταξύ τους γίνεται από το FragmentManager , αυτό έχει πίσω στοίβα .
πώς να βρείτε μηχανικούς λογισμικού
Θα συνειδητοποιήσετε ότι τώρα δεν έχουμε το startActivityForResult () αλλά μπορούμε να εφαρμόσουμε το μοτίβο επιστροφή κλήσης / παρατηρητής . Τώρα ας δούμε μερικά πλεονεκτήματα και μειονεκτήματα αυτής της προσέγγισης:
Τώρα που έχουμε μόνο μία Δραστηριότητα, δεν χρειάζεται πλέον να ενημερώνουμε το μανιφέστο κάθε φορά που προσθέτουμε μια νέα οθόνη. Σε αντίθεση με τις δραστηριότητες, δεν χρειάζεται να δηλώσουμε τα κομμάτια.
Αυτό μπορεί να φαίνεται σαν ένα μικρό πράγμα, αλλά για μεγαλύτερες εφαρμογές με περισσότερες από 50 δραστηριότητες αυτό θα μπορούσε να βελτιώσει σημαντικά την αναγνωσιμότητα του AndroidManifest.xml αρχείο.
Κοιτάξτε το αρχείο δήλωσης για το δείγμα εφαρμογής, το οποίο έχει πολλές οθόνες. Το αρχείο δήλωσης διατηρείται εξαιρετικά απλό.
package='com.exarlabs.android.fragmentnavigationdemo.ui' >
Στο παράδειγμα του κωδικού μου, θα παρατηρήσετε ότι χρησιμοποιώ NavigationManager το οποίο στην περίπτωσή μου εγχέεται σε κάθε ένα από τα θραύσματα. Αυτός ο διαχειριστής μπορεί να χρησιμοποιηθεί ως κεντρικό μέρος για το ξύλευση , διαχείριση πίσω στοίβα μεταξύ άλλων, έτσι οι συμπεριφορές πλοήγησης αποσυνδέονται από την υπόλοιπη επιχειρηματική λογική και δεν κατανέμονται σε εφαρμογές διαφορετικών οθονών.
Ας φανταστούμε μια κατάσταση στην οποία θέλουμε να ξεκινήσουμε μια οθόνη, όπου ο χρήστης μπορεί να επιλέξει ορισμένα στοιχεία από μια λίστα ατόμων. Θα θέλατε επίσης να περάσετε μερικά επιχειρήματα φιλτραρίσματος, όπως ηλικία, επάγγελμα και φύλο.
Στην περίπτωση των Δραστηριοτήτων, γράφετε:
Intent intent = new Intent(); intent.putExtra('age', 40); intent.putExtra('occupation', 'developer'); intent.putExtra('gender', 'female'); startActivityForResult(intent, 100);
Τότε πρέπει να ορίσετε onActivityResult κάπου κάτω και χειριστείτε το αποτέλεσμα.
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); }
Το προσωπικό μου πρόβλημα με αυτήν την προσέγγιση είναι ότι αυτά τα επιχειρήματα είναι 'έξτρα' και δεν απαιτούνται, επομένως πρέπει να βεβαιωθώ ότι η δραστηριότητα λήψης χειρίζεται τις διάφορες περιπτώσεις, όταν λείπει ένα επιπλέον. Στη συνέχεια, όταν γίνει μια αναδιαμόρφωση και όταν δεν απαιτείται πλέον το επιπλέον, 'ηλικία', τότε πρέπει να κοιτάξω όλο τον κώδικα από όπου ξεκίνησε αυτή η δραστηριότητα και να βεβαιωθώ ότι όλα τα πρόσθετα είναι σωστά.
Επίσης, δεν θα ήταν καλύτερο εάν το αποτέλεσμα (λίστα ατόμων) θα έρθει ως _List_ και όχι σε σειριακή φόρμα που θα πρέπει στη συνέχεια να αποεπιλεγεί;
Στην περίπτωση περιήγησης που βασίζεται σε αποσπάσματα, όλα είναι πιο απλά. Το μόνο που έχετε να κάνετε είναι να γράψετε μια μέθοδο στο NavigationManager που ονομάζεται startPersonSelectorFragment () με τα απαραίτητα επιχειρήματα και με μια εφαρμογή επανάκληση .
mNavigationManager.startPersonSelectorFragment(40, 'developer', 'female', new PersonSelectorFragment.OnPersonSelectedListener() { @Override public boolean onPersonsSelected(List selection) { [do something] return false; } });
Ή με Ρετρό Λάμπντα
mNavigationManager.startPersonSelectorFragment(40, 'developer', 'female', selection -> [do something]);
Μεταξύ δραστηριοτήτων, μπορούμε να μοιραστούμε μόνο ένα πακέτο που περιέχει πρωτόγονα ή σειριακά δεδομένα. Τώρα με θραύσματα μπορούμε να εφαρμόσουμε ένα μοτίβο επανάκληση όπου, για παράδειγμα, το F1 μπορεί να ακούσει F2 που περνά αυθαίρετα αντικείμενα. Ρίξτε μια ματιά στα προηγούμενα παραδείγματα εφαρμογής του επανάκληση , που επιστρέφει ένα _List_.
πώς να μετρήσετε την απόδοση της επένδυσης
Αυτό γίνεται προφανές όταν χρησιμοποιείτε ένα συρτάρι που έχει για παράδειγμα 5 στοιχεία μενού και σε κάθε σελίδα το συρτάρι θα πρέπει να εμφανίζεται ξανά.
Σε περίπτωση καθαρής περιήγησης δραστηριότητας, κάθε σελίδα πρέπει να φουσκώνει και να ξεκινά το συρτάρι, αλλά φυσικά αυτό είναι ακριβό.
Στο διάγραμμα που εμφανίζεται μπορείτε να δείτε πολλά θραύσματα ρίζας ή θραύσματα ρίζας (FR *) που είναι τα θραύσματα της οθόνης στα οποία μπορείτε να έχετε απευθείας πρόσβαση από το συρτάρι, καθώς και το συρτάρι είναι προσβάσιμο μόνο όταν εμφανίζονται αυτά τα θραύσματα. Τα πάντα στα δεξιά της σημειωμένης γραμμής στο διάγραμμα υπάρχουν ως παράδειγμα ενός αυθαίρετου σχήματος πλοήγησης.
Εφόσον η δραστηριότητα που περιέχει περιέχει το συρτάρι, έχουμε μόνο μία παρουσία του συρταριού, επομένως κάθε βήμα πλοήγησης όπου το συρτάρι πρέπει να είναι ορατό δεν χρειάζεται να το ξαναρχίσεις . Δεν είστε ακόμα πεπεισμένοι για το πώς λειτουργούν τα πάντα; Ρίξτε μια ματιά στην εφαρμογή δείγμα μου όπου αποδεικνύεται η χρήση συρταριών.
Ο μεγάλος φόβος μου ήταν πάντοτε ότι αν χρησιμοποιώ το μοτίβο πλοήγησης θραυσμάτων σε ένα έργο, τότε σε κάποιο σημείο θα συναντήσω κάποιο άγνωστο πρόβλημα που θα είναι δύσκολο να λυθεί γύρω από την πολυπλοκότητα των θραυσμάτων, των βιβλιοθηκών τρίτων και των διαφορετικών εκδόσεων του συστήματος Επιχειρήσεων. Τι γίνεται αν έπρεπε να διαθλάσω όλα όσα έχω κάνει μέχρι τώρα;
Στην πραγματικότητα, θα πρέπει να λύσετε τα προβλήματα με ένθετα θραύσματα , βιβλιοθήκες τρίτων που χρησιμοποιούν αποσπάσματα όπως ShinobiControls , ViewPagers Υ FragmentStatePagerAdapters .
Παραδέχομαι ότι η απόκτηση αρκετής εμπειρίας με αποσπάσματα για την επίλυση αυτών των προβλημάτων ήταν μια μακρά διαδικασία. Αλλά σε κάθε περίπτωση το πρόβλημα δεν ήταν ότι η φιλοσοφία είναι κακή, αλλά ότι δεν κατάλαβε αρκετά θραύσματα. Αλλά αν καταλαβαίνετε τα θραύσματα καλύτερα από ό, τι εγώ τότε δεν θα έχετε κανένα πρόβλημα.
Τα μόνα μειονεκτήματα που μπορώ να αναφέρω τώρα είναι ότι μπορούμε να βρούμε προβλήματα που δεν είναι ασήμαντα για επίλυση, επειδή δεν υπάρχει ώριμη βιβλιοθήκη που να δείχνει όλα τα περίπλοκα σενάρια μιας σύνθετης εφαρμογής με πλοήγηση με βάση τα θραύσματα.
Σε αυτό το άρθρο, έχουμε δει μια εναλλακτική λύση για την εφαρμογή πλοήγησης σε μια εφαρμογή Android . Το μοτίβο συγκρίθηκε με την παραδοσιακή φιλοσοφία πλοήγησης που χρησιμοποιεί δραστηριότητες και είδαμε μερικούς πολύ καλούς λόγους για τους οποίους είναι συμφέρουσα η χρήση θραυσμάτων αντί της παραδοσιακής προσέγγισης.
Σε περίπτωση που δεν το έχετε ελέγξει ακόμα, ελέγξτε την εφαρμογή επίδειξης στην ανάπτυξη GitHub . Μην φοβάστε να συνεισφέρετε καλά παραδείγματα που θα μπορούσαν να αποδείξουν καλύτερα τη χρήση του.
Σχετίζεται με: Τα 10 πιο συνηθισμένα λάθη που κάνουν οι προγραμματιστές Android