Autore Topic: Problema con DialogFragment e rotazione schermo  (Letto 353 volte)

Offline array81

  • Utente junior
  • **
  • Post: 64
  • Respect: 0
    • Mostra profilo
    • MartinZone
  • Dispositivo Android:
    OnePlus One, Nexus S
  • Play Store ID:
    MartinZone
  • Sistema operativo:
    Windows 7
Problema con DialogFragment e rotazione schermo
« il: 25 Giugno 2014, 12:50:49 CEST »
0
Ho creato un ProgressDialog come estensione di DialogFragment.
Nella mia app ho un activity che richiama una classe all'interno della quale tramite un AsyncTask vado ed estrarre dei dati da un file di testo e li carico in un database sqlite. Il ProgressDialog viene usato per visualizzare il progresso di questa operazione.
Il mio problema é che il codice che ho scritto funziona ma se ruoto il mio device, sebbene il ProgressDialog rimanga, lo stato di avanzamento si ferma mentre l'AsyncTask  continua a fare il suo lavoro.

Vi posto il pezzo di codice dove credo ci sia il problema:

Codice (Java): [Seleziona]
public class TafData {

private Context mContext;

public TafDownload(Context context) {

    mContext = context;
}

... other code ...

private class importTAFAsync extends AsyncTask <String, Integer, String> {
    ... other code ...
}

private void showProgress() {
    TafActivity tafactivity = (TafActivity) mContext;
    FragmentManager fm = tafactivity.getFragmentManager();
    ProgressDialogFragment pDialog = ProgressDialogFragment.newInstance("Caricamento TAF", "Caricamento in corso. Attendere...", 100);
    pDialog.show(fm, "fragment_progress");
}

private void setMax(Integer... values) {
    ProgressDialogFragment progress = getProgressDialogFragment();
    if (progress == null) {
        return;
    }
    progress.setMax(values[0]);
}

private void updateProgress(Integer... values) {
    ProgressDialogFragment progress = getProgressDialogFragment();
    if (progress == null) {
        return;
    }
    progress.updateProgress(values[0]);
}

private void hideProgress() {
    ProgressDialogFragment progress = getProgressDialogFragment();
    if (progress == null) {
        return;
    }
    progress.dismissAllowingStateLoss();
}

private ProgressDialogFragment getProgressDialogFragment() {
    TafActivity tafactivity = (TafActivity) mContext;

    Fragment fragment = tafactivity.getFragmentManager().findFragmentByTag("fragment_progress");
    return (ProgressDialogFragment) fragment;
}
}

mentre questo é il pezzo del manifest:

Codice (XML): [Seleziona]
<activity
   android:name="com.myapp.TafActivity"
   android:label="@string/title_activity_taf">
    <meta-data
       android:name="android.support.PARENT_ACTIVITY"
       android:value="myapp.MapsActivity" />
</activity>

dai miei controlli il problema deriva dal fatto che a seguito della rotazione il metodo getProgressDialogFragment restituisce sempre NULL e non capisco il perchè.
Ho anche provato ad aggiungere "android:configChanges="orientation|keyboardHidden" al manifest ma non cambia nulla.

Qualcuno mi può illuminare a riguardo? Sicuramente sbaglio qualcosa a causa della mia inesperianza con il JAVA (prima app android).

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:Problema con DialogFragment e rotazione schermo
« Risposta #1 il: 25 Giugno 2014, 13:39:22 CEST »
0
Quasi sicuramente è perchè alla rotazione, l'activity corrente viene distrutta e ricreata, per cui il Context precedente perde di valore.

Nella parte finale di questo articolo vengono spiegate un paio di tecniche che potrebbero risolvere il tuo problema: Handling progress dialogs and orientation changes
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline array81

  • Utente junior
  • **
  • Post: 64
  • Respect: 0
    • Mostra profilo
    • MartinZone
  • Dispositivo Android:
    OnePlus One, Nexus S
  • Play Store ID:
    MartinZone
  • Sistema operativo:
    Windows 7
Re:Problema con DialogFragment e rotazione schermo
« Risposta #2 il: 25 Giugno 2014, 17:24:35 CEST »
0
Grazie della risposta. Penso che il problema sia quello da te esposto ma sinceramente leggendo l'articolo non mi ben chiaro come risolvere il mio caso.
Avvicinandomi per la prima volta alla programmazione per android lasciatemi dire che il ciclo di vita delle activity é qualcosa di "antipatico" per non dire altro. Io capisco la necessità di avere un sistema in grado di liberare risorse all'occorrenza ma almeno gestire in automatico la rotazione dello schermo...

Comunque se qualcuno mi può indicare come risolvere mi fa un piacere. Personalmente il fatto di passare per una classe e non eseguire il tutto direttamente dall'activity (per una scelta di "pulizia") mi complica il trasporre altre soluzione come quella sopra suggerita.

Post unito: 26 Giugno 2014, 10:20:55 CEST
Vedo di rispondermi almeno parzialmente da solo in modo da aiutare chi si trovasse nel mio caso.
A questo indirizzo c'è un articolo che permette di risolvere quasi completamente il problema del primo post:
Handling AsyncTasks and DialogFragments with orientation changing [Java - Android] - Callum Taylor's Blog


Tuttavia rimane un piccolo problema che vi vado ad esporre sperando che mi possiate aiutare.
Utilizzando la soluzione proposta nel link il ProgressDialog funziona esattamente come voluto anche se lo schermo viene ruotato.
Nel mio caso avrei però la necessità di usare 2 ProgressDialog, uno durante il processo di download del file di testo quindi a seguire uno per mostrare il caricamento dei dati nel database.
Il problema si pone quando l'utente ruota lo schermo durante la visualizzazione del primo ProgressDialog a seguito di ciò infatti il secondo ProgressDialog restituisce un errore nel metodo Show del tipo: "Can not perform this action after onSaveInstanceState"

Come posso evitare la comparsa di questo errore?
« Ultima modifica: 26 Giugno 2014, 10:20:55 CEST da array81, Reason: Merged DoublePost »