Πώς να επικοινωνείτε μεταξύ θραυσμάτων και δραστηριότητας χρησιμοποιώντας το ViewModel

Η επικοινωνία είναι ένα από τα πιο σημαντικά θέματα για τους προγραμματιστές και μπορεί να γίνει με πολλούς τρόπους. Αλλά η πρόκληση είναι να το κάνουμε με ευκολότερο και βελτιστοποιημένο τρόπο. Μπορούμε να το κάνουμε χρησιμοποιώντας static filed αλλά θα προκύψει ζήτημα μνήμης. Για να αποφύγετε το πρόβλημα μνήμης πολλοί προγραμματιστές κάνουν κάτι σαν

(δραστηριότητα ως MainActivity) .passDataToAnotherFragment ()

Ποιο είναι το πρόβλημα με αυτόν τον τρόπο; Συνδέει το θραύσμα με μια συγκεκριμένη δραστηριότητα, μειώνει την επαναχρησιμοποίηση. Τότε ποιος είναι ο συνιστώμενος τρόπος;

Η Google συνιστά τη χρήση διεπαφής (πριν από το ViewModel) doc. Για αυτό πρέπει να εφαρμόσουμε τη διεπαφή στην κλάση δραστηριότητας. Τα θραύσματα παιδιών θα περιέχουν μια αναφορά της διεπαφής που εφαρμόζεται από τη δραστηριότητα. Τα δεδομένα θα διαβιβαστούν μέσω μεθόδων διεπαφής.

ροή εργασίας της επικοινωνίας μέσω διεπαφής

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

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

Εύκολος τρόπος

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

ροή εργασίας επικοινωνίας με το ViewModel

Δημιουργήστε μια κλάση ViewModel

class SharedViewModel: ViewModel () {
    val inputNumber = ΜεταβλητήLiveData  ()
}}

Για να εκπέμψετε ή να περάσετε δεδομένα από το τμήμα εισόδου μας, δημιουργήστε το ViewModel στο πεδίο δραστηριότητας. Για να γίνει αυτό, πρέπει να περάσουμε την αναφορά δραστηριότητας ως επιχείρημα της μεθόδου ViewModelProvides.of (). Ο Noe μόλις πέρασε τα δεδομένα στο αντικείμενο ViewModel όπως αυτό

δραστηριότητα; .let {
    sharedViewModel = ViewModelProviders.of (αυτό) .get (SharedViewModel :: class.java)
}}

et_input.addTextChangedListener (αντικείμενο: TextWatcher {
    αντικατάσταση διασκέδασης afterTextChanged (p0: Επεξεργάσιμη;) {}

    (p0: CharSequence ;, p1: Int, p2: Int, p3: Int) {} Παράθεση

    αντικατάσταση διασκέδασης onTextChanged (txt: CharSequence ;, p1: Int, p2: Int, p3: Int) {
        txt? .let {
            var input = 0
            αν (txt.toString (). isNotEmpty ()) {
                είσοδος = txt.toString (). toInt ()
            }}

            sharedViewModel; .inputNumber; .postValue (είσοδος)
        }}
    }}

Στη δραστηριότητα πρέπει απλώς να δημιουργήσουμε στιγμιότυπα του ViewModel και να παρατηρήσουμε τα απαιτούμενα δεδομένα όπως αυτό

val sharedViewModel = ViewModelProviders.of (αυτό) .get (SharedViewModel :: class.java)

sharedViewModel.inputNumber.observe (αυτό, παρατηρητής {
    αυτό; .let {
        // κάνει κάτι με τον αριθμό
    }}
})

Τώρα τι γίνεται με το κομμάτι εξόδου; Μπορούμε να κάνουμε το ίδιο για το κομμάτι εξόδου για να παρατηρήσουμε τα δεδομένα. Λάβετε όμως υπόψη ότι χρειάζεται να δημιουργήσετε την παρουσία του ViewModel στο πεδίο δραστηριότητας, διαφορετικά το Android θα δημιουργήσει μια ξεχωριστή παρουσία παρά να μοιραστεί την ίδια εμφάνιση και δεν θα λάβουμε τα δεδομένα.

Για το κομμάτι εξόδου το κάνετε όπως αυτό

δραστηριότητα; .let {
    val sharedViewModel = ViewModelProviders.of (αυτό) .get (SharedViewModel :: class.java)

    sharedViewModel.inputNumber.observe (αυτό, παρατηρητής {
    αυτό; .let {
            // κάνει κάτι με τον αριθμό
        }}
    })
}}

Αυτό είναι. Ο πηγαίος κώδικας μπορεί να βρεθεί εδώ.

StackOverflow συζήτηση

Happy Coding