Autore Topic: Comunicazione tra fragment, datemi un'opinione please!  (Letto 604 volte)

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Comunicazione tra fragment, datemi un'opinione please!
« il: 21 Ottobre 2015, 11:56:39 CEST »
0
Dunque, avevo un'applicazione composta da molte activity; nella versione che sto aggiornando ho deciso di trasformare tutte le activity in fragments (ad eccezione della principale, ovviamente ;) ) ed utilizzare il navigation drawer.

Mentre prima usavo gli intent, e dove necessario usavo startactivity for result, ora la situazione è completamente differente: devo comunicare tra fragment in molti casi, ma non sempre.

Io l'ho risolto utilizzando le interfacce, ho creato 2 semplici classi di interfaccia una per comunicare tra fragment e activity, l'altra per la comunicazione opposta; i dati che mi serve passare sono semplici interi: mittente, destinatario e dato.
Il valore del mittente indica quale fragment invia il valore ( ad esempio: fragment 5 può essere chiamato da fragment 1 e 2);
Il valore del destinatario indica quale fragment deve ricevere il valore;
Il valore di dato è il parametro che indica al destinatario cosa deve fare.

Ora vorrei una vostra opinione in merito alla mia soluzione, cosa ne dite?
Se la mia risposta ti è utile, per favore un thanks!

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Comunicazione tra fragment, datemi un'opinione please!
« Risposta #1 il: 21 Ottobre 2015, 14:11:36 CEST »
0
Per me va bene quello che hai fatto. Perchè in teoria ti consente di cambiare un fragment senza dover toccare l'altro.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline tonno16

  • Utente storico
  • *****
  • Post: 1228
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Comunicazione tra fragment, datemi un'opinione please!
« Risposta #2 il: 21 Ottobre 2015, 14:16:59 CEST »
0
Anche per me. Ok che da da documentazione viene usata l'interfaccia per la comunicazione in un senso. Ma nell' altro senso basta che chiami un metodo del fragment.
Se il tuo CustomFragment ha un metodo "public void calcolaMedia()" puoi chiamare tale metodo dalla tua activity.
E se devi far comunicare 2 o più fragment bisognerebbe passare dall' activity padre.

Hai pensato di usare eventBus o altri librerie simili? A me hanno risolto molti problemi

Online iClaude

  • Utente normale
  • ***
  • Post: 246
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S8
  • Sistema operativo:
    Windows 10
Re:Comunicazione tra fragment, datemi un'opinione please!
« Risposta #3 il: 21 Ottobre 2015, 14:57:37 CEST »
0
Il tuo sistema è certamente valido e molto facile da implementare.

Se vuoi una soluzione più sofisticata ed elegante potresti pensare di utilizzare il pattern Mediator, dove i Fragment hanno il ruolo di Colleague e l'Activity, o meglio un'interfaccia all'interno dell'Activity, quello di Mediator.
Non è molto diverso da quello che hai fatto tu, ma è una soluzione più formalizzata.
A occhio mi sembra una soluzione adatta a questo caso perché la comunicazione avviene tra soggetti di pari grado, i Fragment attraverso un'interfaccia Mediator centralizzata. Nel tuo caso ti permetterebbe anche di disaccoppiare i Fragment che nel tuo caso invece sono strettamente accoppiati, visto che devono specificare mittente e destinatario, con tutti i problemi del caso nell'ipotesi di modifica del codice.
« Ultima modifica: 21 Ottobre 2015, 22:16:29 CEST da iClaude »

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Re:Comunicazione tra fragment, datemi un'opinione please!
« Risposta #4 il: 22 Ottobre 2015, 09:23:57 CEST »
0
Grazie a tutti.

@tonno16:
Non ho pensato a librerie perchè volevo una cosa molto semplice, come semplici sono i parametri.

Un esempio reale di uso: dal fragment che elenca gli eventi si passa al fragment di dettaglio; da questo si può:
- eliminare l'evento: comunica al fragment precedente che è eliminato così al ritorno viene tolto dalla lista
- modificare l'evento: chiama il fragment di aggiunta comunicando che si tratta di modifica (mittente è il dettaglio) e quindi carica i dati dal db, a questo punto dopo la modifica si torna indietro e si comunica alla lista e al dettaglio che ci sono variazioni.

@iClaude:
Si è vero che avendo codificato tutto mittenti/destinatari è molto legato al codice, infatti nella classe dell'interfaccia ho come "mega"commento  gli identificativi stabiliti, però la codifica è unica il fragment A è valore 1 sia come mittente che come destinatario e i valori che vengono passati sono semplicemente  le operazioni (nulla, modifica, eliminazione).
In realtà in questo specifico caso non potrebbero essere completamente slegate: il dettaglio di un evento può comunicare solo con l'elenco o con il form di modifica.

Lo schema dell'app è + o -  questo:

Vista principale (elenco eventi/attività) -> dettaglio evento/attività  -> elimina/modifica/indietro
Se la mia risposta ti è utile, per favore un thanks!

Offline lillogoal

  • Utente normale
  • ***
  • Post: 167
  • Respect: +4
    • Google+
    • lillosogliani
    • Mostra profilo
    • LilloNet
  • Dispositivo Android:
    Galaxy s3, Nexus 7,galaxy s advance,galaxy scl
  • Play Store ID:
    Lillonet Inc.
  • Sistema operativo:
    Windows 8,7 & Kali-Linux
Re:Comunicazione tra fragment, datemi un'opinione please!
« Risposta #5 il: 22 Ottobre 2015, 11:03:03 CEST »
0
Hai bisogno di mandare Informazioni tra fragment?
Chi non progetta la sicurezza , programma il fallimento! K.M

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Re:Comunicazione tra fragment, datemi un'opinione please!
« Risposta #6 il: 22 Ottobre 2015, 11:42:12 CEST »
0
Hai bisogno di mandare Informazioni tra fragment?

L'unica informazione che passa è quella che indica se ci sono stati cambiamenti (modifiche/eliminazioni).
Se la mia risposta ti è utile, per favore un thanks!

Offline lillogoal

  • Utente normale
  • ***
  • Post: 167
  • Respect: +4
    • Google+
    • lillosogliani
    • Mostra profilo
    • LilloNet
  • Dispositivo Android:
    Galaxy s3, Nexus 7,galaxy s advance,galaxy scl
  • Play Store ID:
    Lillonet Inc.
  • Sistema operativo:
    Windows 8,7 & Kali-Linux
Re:Comunicazione tra fragment, datemi un'opinione please!
« Risposta #7 il: 22 Ottobre 2015, 11:43:49 CEST »
0
COn i Bundle non puoi passare String,int,Object ecc?
Chi non progetta la sicurezza , programma il fallimento! K.M

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Re:Comunicazione tra fragment, datemi un'opinione please!
« Risposta #8 il: 22 Ottobre 2015, 12:42:12 CEST »
0
COn i Bundle non puoi passare String,int,Object ecc?

In sostanza la mia applicazione assomiglia molto all'app di GMAIL dal punto di vista strutturale, con il navigation drawer passi tra le viste principali (eventi, attività, cronologia, statistiche, ecc); da questi elenchi entri nel dettaglio dell'oggetto (evento, attività) con bundle passi id per recuperare i dati; dal dettaglio puoi eliminare/modificare l'oggetto e quando torni indietro devi comunicare la cancellazione o modifica alla vista precedente e a quella cronologica (non ha senso vedere in elenco un oggetto appena eliminato, no?)

Come vedi ho detto torno indietro non avvio una nuova activiy, tornando indietro non puoi usare i bundle.
Se la mia risposta ti è utile, per favore un thanks!