CERCA
PER MODELLO
FullScreen Chatbox! :)

Utente del giorno: carotix con ben 2 Thanks ricevuti nelle ultime 24 ore
Utente della settimana: 9mm con ben 11 Thanks ricevuti negli ultimi sette giorni
Utente del mese: 9mm con ben 34 Thanks ricevuti nell'ultimo mese

Pagina 1 di 2 12 ultimoultimo
Ultima pagina
Visualizzazione dei risultati da 1 a 10 su 20
Discussione:

Problematiche legate alla ROTAZIONE

Se questa discussione ti è stata utile, ti preghiamo di lasciare un messaggio di feedback in modo che possa essere preziosa in futuro anche per altri utenti come te!
  1. #1
    Baby Droid


    Registrato dal
    Oct 2009
    Messaggi
    27

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Problematiche legate alla ROTAZIONE

    Un mesetto fa avevo già aperto un topic simile riguardo alla gestione della rotazione.

    Quello che so sulla rotazione l'ho appreso da questo LINK, molto utile e da consigliarsi sicuramente per chi vuole utilizzare questa feature.

    Nel mio caso ho una app che ha una ListActivity come activty principale.
    Questa lista è popolata con dei dati che recupero sulla rete da un file XML.
    La lista non è altro che un ArrayList<T> di oggetti ottenuti parsando il file XML con SAXparser.

    La mia app mostra una ProgressDialog mentre il thread in background svolge questo lavoro (scarica, parsa e riempio il mio ArrayList). Quando il thread termina invia un "segnale" (Handler messi a disposizione dall'OS) all'activity principale che popola la ListView, così so quando interrompere la ProgressDialog e visualizzare la ListView. Fino a qui tutto ok

    I problemi li ho incontrati con la rotazione... io ho adottato il metodo proposto nella PART TWO del tutorial che ho linkato prima, ossia utilizzo onRetainNonConfigurationInstance(), per salvare lo stato del mio ArrayList al momento della rotazione per poir creare la nuova actiivty da questo, perchè la rotazione distrugge l'activity con onDestroy e ne ricrea un'altra con onCreate().
    Se passo da portrait a landscape con la mia lista già riempita e visibile a video, tutto funziona alla grande.
    Se invece la rotazione viene fatta durante il download, quindi con la progress dialog attivata, ho dei problemi... mi capitano sempre due casi.

    Premetto che la progressDialog la chiudo manualmente quando viene fatta la onDestroy della activity, quindi quando catturerò l'handler semplicemente verrà ignorato, perchè troverà la progressdialog già chiusa.

    veniamo ai due casi che vi dicevo:

    caso 1: apro il tastierino con la progress dialog attiva. Il tutto sembra funzionare bene, la rotazione funziona. La onRetainNonConfigurationInstance() mi salva l'ArrayList che il thread a riempito, dal Log vedo che è effettivamente pieno, e va tutto ok.

    caso 2: se sono veloce e apro il tastierino appena un istante prima che la ProgressDialog appaia o quasi "in contemporanea", avviene la rotazione in landscape senza nessun crash, quindi viene creata la nuova activity ma la lista appare vuota. Se chiudo il tastierino e riporto tutto in portrait, magicamente la lista appare piena e viene visualizzata. Ovviamente c'è qualcosa che non torna... boh?!

    Dai Log (sempre del caso 2), risulta che: la onRetainNonConfigurationInstance() salva l'ArrayList vuoto, evidentemente sono stato così veloce che il thread non lo ha ancora riempito, il che mi fa pensare che venga visualizzata vuota per questo motiv, ma il thread continua in background lo stesso... teoricamente anche se la progress dialog è stata chiusa nella onDestroy(), l'handler mi arriva lo stesso per segnalarmi che il thread ha finito, è a questo punto che io popolo la listaview con i dati presenti nell'arrayList, perchè anche se l'ho ripristinata a partire da vuota, mi aspetto che alla fine il thread l'abbia cmq riempita, invece mi appare vuota a schermo.
    La cosa strana è come vi ho detto che se da questo punto io ruoto di nuovo e riporto tutto in portrait, il log mi dice che onRetainNonConfigurationInstance() salva una lista piena, (ma allora il thread l'ha riempita per davvero?) e infatti in portrait viene mostrata a video.

    Non capisco perchè di questa cosa... se fosse vuota dovrebbe esserlo sempre, o viceversa se fosse piena dovrebbe esserlo sempre.

    Spero di essermi riuscito a spiegare, capisco che per certe cose servirebbe il codice, ma vorrei cercare di capire insieme a voi cosa c'è che sbaglio o forse ignoro.

  2.  
  3. #2
    Administrator L'avatar di Andrea


    Registrato dal
    Nov 2008
    Messaggi
    3,368
    Smartphone
    Nexus S, myTouch Slide 4g

    Ringraziamenti
    143
    Ringraziato 880 volte in 323 Posts
    Predefinito

    Certo un po di codice non sarebbe male. Hai provato a considerare l'utilizzo di variabili statiche ? Magari dirò una cazzata ma potrebbero aiutare.

    Twitter @veke87

  4. #3
    Androidiano


    Registrato dal
    May 2009
    Messaggi
    250

    Ringraziamenti
    2
    Ringraziato 30 volte in 23 Posts
    Predefinito

    Come dici giustamente l'activity dopo la rotazione viene distrutta e ricreata, ma se aggiungi

    android:configChanges="keyboardHidden|orientation"

    alla activity nel manifest, questo ciclo non avviene... e se devi fare qualcosa quando lo schermo viene ruotato, lo puoi fare in onConfigurationChanged

  5. #4
    Administrator L'avatar di Andrea


    Registrato dal
    Nov 2008
    Messaggi
    3,368
    Smartphone
    Nexus S, myTouch Slide 4g

    Ringraziamenti
    143
    Ringraziato 880 volte in 323 Posts
    Predefinito

    Fico, questo non lo sapevo.

    Per completezza:

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.myLayout);
    }

    Twitter @veke87

  6. #5
    Androidiano


    Registrato dal
    May 2009
    Messaggi
    250

    Ringraziamenti
    2
    Ringraziato 30 volte in 23 Posts
    Predefinito

    Non è indispensabile richiamare setContentView...

  7. #6
    Administrator L'avatar di Andrea


    Registrato dal
    Nov 2008
    Messaggi
    3,368
    Smartphone
    Nexus S, myTouch Slide 4g

    Ringraziamenti
    143
    Ringraziato 880 volte in 323 Posts
    Predefinito

    Beh io la richiamerei se faccio un layout differente (con nome differente ) per l'orientamento orizzontale.

    Twitter @veke87

  8. #7
    Baby Droid


    Registrato dal
    Oct 2009
    Messaggi
    27

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Quote Originariamente inviato da BitBerzerkir Visualizza il messaggio
    Come dici giustamente l'activity dopo la rotazione viene distrutta e ricreata, ma se aggiungi

    android:configChanges="keyboardHidden|orientation"

    alla activity nel manifest, questo ciclo non avviene... e se devi fare qualcosa quando lo schermo viene ruotato, lo puoi fare in onConfigurationChanged
    si, conoscevo anche questa possibilità. Ora non ricordo, ma l'avevo scartata per un qualche motivo legato ai layout.

  9. #8
    Androidiano


    Registrato dal
    May 2009
    Messaggi
    250

    Ringraziamenti
    2
    Ringraziato 30 volte in 23 Posts
    Predefinito

    A me sembra una buona soluzione, perché non ti ammazza l'interfaccia e i thread... se hai problemi con i layout puoi ricrearli nella funzione citata

  10. #9
    Baby Droid


    Registrato dal
    Oct 2009
    Messaggi
    27

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    ok, ma voglio vedere di arrivare in fondo anche con quest'altra strada. Nessuno ha mai utilizzato il mio metodo con onRetainNonConfigurationInstance()?

  11. #10
    Senior Droid L'avatar di Mazinkaiser


    Registrato dal
    Sep 2009
    Messaggi
    487

    Ringraziamenti
    20
    Ringraziato 10 volte in 10 Posts
    Predefinito

    Quote Originariamente inviato da BitBerzerkir Visualizza il messaggio
    Come dici giustamente l'activity dopo la rotazione viene distrutta e ricreata, ma se aggiungi

    android:configChanges="keyboardHidden|orientation"

    alla activity nel manifest, questo ciclo non avviene... e se devi fare qualcosa quando lo schermo viene ruotato, lo puoi fare in onConfigurationChanged
    mazza utilissimo questo attributo o.o, quindi in questo modo, la view passa in landscape senza essere ricreata? è una bomba... che problemi di layout comporta, giusto che non possiamo ricrearne una specifica per il landscape o che?

Pagina 1 di 2 12 ultimoultimo
Ultima pagina

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire risposte
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Torna su
Privacy Policy