Πίνακας περιεχομένων:
Βίντεο: Supersection Week 1 2024
Όταν ξεκινάτε ένα νέο έργο Java, το Android Studio προσφέρει να δημιουργήσετε μια δραστηριότητα για το έργο σας. Το Android Studio σας προσφέρει διάφορα είδη δραστηριοτήτων, όπως Βασική Δραστηριότητα, Κενή Δραστηριότητα, Δραστηριότητα Σύνδεσης και ούτω καθεξής. Εάν ζητήσετε μια Empty Activity, θα λάβετε αυτόν τον κωδικό:
πακέτο com. allyourcode. a10_11;
εισαγωγή του Android. υποστήριξη. v7. app. AppCompatActivity;
Εισαγωγή του. os. Δέσμη;
η δημόσια κλάση MainActivity επεκτείνει το AppCompatActivity {
@Override
προστατεύεται void onCreate (Bundle savedInstanceState) {
σούπερ. onCreate (savedInstanceState);
setContentView (διάταγμα διάταξης.activity_main);
}
}
Ο κώδικας δηλώνει μια κλάση που ονομάζεται
MainActivity
. Αυτό το όνομα
MainActivity
δεν αποτελεί μέρος της βιβλιοθήκης API του Android. Είναι ένα όνομα που δημιουργείτε όταν δημιουργείτε ένα νέο πρόγραμμα Android. (Στην πραγματικότητα, το Android Studio αναπαριστά το όνομα. Αποδέχεστε το όνομα ή αλλάξτε το σε κάποιο άλλο όνομα όταν ακολουθείτε τα βήματα για να δημιουργήσετε ένα νέο έργο.)
Η κλάση
MainActivity
επεκτείνει μια κλάση που ανήκει στη βιβλιοθήκη SDK του Android, δηλαδή στην κλάση
AppCompatActivity
. Με άλλα λόγια, το αντικείμενο
MainActivity
είναι ένα αντικείμενο
AppCompatActivity
. Το αντικείμενο
MainActivity
έχει όλα τα δικαιώματα και τις ευθύνες που έχει οποιαδήποτε παράμετρος
AppCompatActivity
. Για παράδειγμα, η
MainActivity
έχει μια μέθοδο
onCreate
, την οποία παρακάμπτει.
κληρονόμησε περίπου 460 γραμμές κώδικα από την κατηγορία
AppCompatActivity
της Android, η οποία κληρονόμησε περίπου 1.000 γραμμές από το
FragmentActivity
, η οποία κληρονόμησε περίπου 6, 700 γραμμές από την κλάση δραστηριότητας του Android. Οι κληρονομικές μέθοδοι συμπεριλαμβάνουν
getCallingActivity
,
getCallingPackage
,
getParent
, getTitleColor
onKeyLongPress
,
onLowMemory
,
onMenuItemSelected
,
setTitle
onBackPressed
,
setTitleColor
,
startActivity
, φινίρισμα και πολλά, πολλά άλλα. Μπορείτε κληρονομούν όλες αυτές τις λειτουργίες με δύο απλές λέξεις: επεκτείνει
AppCompatActivity
.
Στην ορολογία των οικογενειακών σχέσεων, η τάξη σας
MainActivity
είναι απόγονος της κατηγορίας
Δραστηριότητα
του Android. Η κλάση σας
MainActivity
είναι ένα είδος
Δραστηριότητα
.
Αυτή η εικόνα, που λαμβάνεται απευθείας από την ηλεκτρονική τεκμηρίωση του Android, συνοψίζει αυτές τις πληροφορίες σχετικά με την τάξη
AppCompatActivity
.
Ένα οικογενειακό δέντρο AppCompatActivity.
Σημειώστε τη σελίδα για εύκολη πρόσβαση στην τεκμηρίωση της βιβλιοθήκης API του Android.
Εκτός από την ύπαρξη υποκατηγορίας, η κλάση
AppCompatActivity
υλοποιεί μια δέσμη διασυνδέσεων, συμπεριλαμβανομένης της διεπαφής
AppCompatCallback, της διεπαφής
TaskStackBuilder
και άλλων. Δεν χρειάζεται να θυμάστε κάτι τέτοιο. Αν χρειάζεται να το γνωρίζετε, μπορείτε να το αναζητήσετε στη σελίδα τεκμηρίωσης του Android.
Η λέξη
super
αντιπροσωπεύει τον κατασκευαστή της υπερκλάσης. Ο διαφορετικός κώδικας χρησιμοποίησε τη λέξη
σούπερ
με διαφορετικούς τρόπους. Ναι, το
σούπερ
έχει πάντα σχέση με την τάξη γονέων μιας τάξης. Αλλά, όχι,
super
δεν αναφέρεται πάντοτε στον κατασκευαστή της γονικής κλάσης.
Σε μια μέθοδο
onCreate
, η κλήση
σούπερ. onCreate (savedInstanceState)
στέλνει
savedInstanceState
στη μέθοδο
onCreate
γονικής κλάσης. Η γονική κλάση είναι η κλάση
AppCompatActivity
. Έτσι, η Java καλεί τη μέθοδο
AppCompatActivit
y
onCreate
.
Η μέθοδος
AppCompatActivity
onCreat
e της κατηγορίας περιλαμβάνει τη δική της κλήση σε
σούπερ. onCreate (savedInstanceState)
. Ο γονέας της κατηγορίας
AppCompatActivity
είναι η κλάση
FragmentActivity
. Έτσι, η Java περνάει
savedInstanceState
στη μέθοδο
FragmentActivity
onCreate
της κλάσης. Και ούτω καθεξής.
Μόλις φτάσετε στην κλάση
Δραστηριότητα
- ο προ-παππούς της κατηγορίας M
ainActivity
, ο κώδικας κάνει άμεση χρήση της μεταβλητής
savedInstanceState
. Από αυτές τις πληροφορίες
savedInstanceState
, ο κώδικας επαναφέρει τη δραστηριότητα όπως ήταν πριν το καταστρέψει το σύστημα.
Casting, και πάλι
Όταν καλείτε
findViewById
, η Java δεν γνωρίζει τι είδους προβολή θα βρει. Η μέθοδος
findViewById
πάντα επιστρέφει μια εμφάνιση
Προβολή
, αλλά πολλές κατηγορίες του Android επεκτείνουν την κλάση
Προβολή
. Για παράδειγμα, τα
πλήκτρα
,
TextView
,
ImageView
,
CheckBox
,
όλοι επεκτείνουν την κλάση Android
View
. Εάν πληκτρολογήσετε τον ακόλουθο κώδικα:
// ΜΗΝ ΑΚΟΜΑΣΤΕ! !
TextView textView;
textView = findViewById (κωδικός αναγνώρισης κειμένου);
Η Java δίνει ένα ηχηρό βόμβο: "Πώς τολμάς να υποθέσεις ότι το αντικείμενο που επιστρέφεται από μια κλήση στο
findViewById
αναφέρεται σε μια εμφάνιση της κλάσης
TextView
! "(Στην πραγματικότητα, η Java σιωπά και μηχανικά εμφανίζει μήνυμα σφάλματος
Μη συμβατό τύπο
στον επεξεργαστή του Android Studio.)
Περιορισμός
σημαίνει προσπάθεια εκχώρησης μιας
> int
. Μια τιμή
μακρά
έχει 64 μπιτ και μια τιμή
int
έχει μόνο 32 bits. Επομένως, η προσπάθεια για στένωση αποτυγχάνει. Στον κώδικα που βρίσκετε εδώ, η κακή κλήση
findViewById
είναι μια άλλη προσπάθεια να γίνει στενότητα - η απόδοση της τιμής Προβολή που επιστρέφεται με μια κλήση μεθόδου σε μια μεταβλητή
TextView.Η κλάση
TextView
είναι μια υποκατηγορία της κλάσης
Προβολή
, οπότε η ανάθεση αποτυγχάνει άθλια.
χαλαρώστε τους θεούς Java προσθέτοντας έναν χειριστή χύτευσης στον κώδικα. Μπορείτε να πείτε στο Java να μετατρέψει οτιδήποτε ξεκινά από την κλήση μεθόδου
findViewById
σε αντικείμενο
TextView
.
textView =
(TextView)
findViewById (Αναγνωριστικό κειμένου textView1);
Κατά την πληκτρολόγηση του κώδικα, το Java χτυπάει εσείς και λέει: "Ο χειριστής του casting μου δείχνει ότι γνωρίζετε τη διαφορά μεταξύ
TextView
και κάθε παλιά
Προβολή
. Θα κάνω το καλύτερό μου για να ερμηνεύσω το αντικείμενο
View
που βρίσκω στο runtime ως αντικείμενο
TextView
. "(Στην πραγματικότητα, ενώ πληκτρολογείτε τον κώδικα, η Java δεν λέει τίποτα.) Το γεγονός ότι η Java δεν εμφανίζει μηνύματα σφάλματος όταν χρησιμοποιείτε αυτό το τέχνασμα είναι ένα καλό σημάδι.Η δυνατότητα χύτευσης της Java αποθηκεύει την ημέρα!)
Casting σας εμποδίζει να βλέπετε ένα μήνυμα σφάλματος κατά την ανάπτυξη του κώδικα σας. Με αυτόν τον τρόπο, η χύτευση είναι πολύ χρήσιμο χαρακτηριστικό της Java. Αλλά η χύτευση δεν μπορεί να σας εξοικονομήσει εάν ο κώδικας σας περιέχει σφάλματα χρόνου εκτέλεσης. Όταν πληκτρολογείτε
textView = (TextView) findViewById (R id id textView1);
επιβεβαιώνετε ότι το όνομα textView αντιπροσωπεύει ένα γραφικό στοιχείο
TextView
. Όταν εκτελείται η εφαρμογή, η Java αρπάζει το
R. ταυτότητα. textView
από το
activity_main. xml
αρχείο, και όλα λειτουργούν καλά. Αλλά μπορείτε μερικές φορές να ξεχάσετε να ελέγξετε το
R σας. java
ονόματα ενάντια στα στοιχεία του αρχείου XML. Μια κλήση στο
findViewById
εκπλήσσει έκπληξη ένα στοιχείο
Button
όταν το casting σας λέει στην Java να περιμένει ένα widget
TextView
. Όταν συμβεί αυτό, το Java πνίγει στον χειριστή της χύτευσης και η εφαρμογή σας διακόπτεται κατά τη διάρκεια της εκτέλεσης. Πίσω στο σχεδιαστήριο!