Autore Topic: Fragment & proseguimento video al cambio orientamento  (Letto 389 volte)

Offline wlf

  • Utente normale
  • ***
  • Post: 319
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Fragment & proseguimento video al cambio orientamento
« il: 05 Agosto 2014, 12:32:29 CEST »
0
Salve,
sono partito dall'esempio che potete trovare su GitHub, a questo ho modificato la classe Recipes sostituendo i due metodi originari, titles e recipes che restituivano due string array, con due nuovi metodi che restituiscono due arrayList sottostanti:

Codice (Java): [Seleziona]
        public static ArrayList<String> files()  
        {
                ArrayList<String> list = new ArrayList<String>();
                Field[] fields = R.raw.class.getFields();
                for(Field f : fields) {
                        try {
                                list.add(f.getName()); 
                        } catch (IllegalArgumentException e) {
                        }
                }
                return list;
        };

        public static ArrayList<Integer> resid()  
        {
                ArrayList<Integer> list = new ArrayList<Integer>();
                Field[] fields = R.raw.class.getFields();
                for(Field f : fields) {
                        try {
                                list.add(f.getInt(null));      
                        } catch (IllegalArgumentException e) {                         
                        } catch (IllegalAccessException e) {                           
                        }
                }
                return list;
        };

Ho fatto qualche ritocco alla classe TitlesFragment mettendo Recipes.files() al posto di Recipes.titles, ho creato una cartella raw nella quale ho inserito qualche video di ricette, ho quindi avviunto una ViedeoView al layout fragment_description ho quindi aggiunto la visualizzazone

Codice (Java): [Seleziona]
        public void setDescriptionIntoFragment(Integer s)
        {
                TextView tv = (TextView) getView().findViewById(R.id.description_textView);            
                VideoView vv = (VideoView) getView().findViewById(R.id.videoView1);
               
                tv.setText(s);
               
                vv.setMediaController(new MediaController(getActivity()));
                Uri video = Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + s);               
                vv.setVideoURI(video);
                vv.start();                    
        }

Fino a qui funziona tutto correttamente; ora vengono le dolenti note ... :(

Se cambio l'orientamento da Portrait a Landscape o viceversa il video si interrompe immediatamente; io vorrei che perlomeno quando passo da Portrait a Landscape il video non si interrompa e continui da dove si era interrotto durante il cambio orientamento.
Per fare questo ho aggiunto nella DescriptionFragment il codice sottostante:
Codice (Java): [Seleziona]
        @Override
        public void onSaveInstanceState(Bundle outState) {
                super.onSaveInstanceState(outState);
                int prova = vv.getCurrentPosition();
                outState.putInt("Prova", prova);
        }

ed ho cercato di recuperare dal Bundle il valore salvato sia dalla onCreateView che dalla onCreate, ma, per qualche strano motivo, non riesco a recuperare il valore salvato. :(

Sono ancora in fase di studio delle Fragment, mi sfugge qualcosa sul loro ciclo di vita; facendo dei test ho notato che partendo in modalità Portrait, facendo partire l'App, si passa prima dalla MainActivity che implementa  il ListFragment TitlesFragment, selezionando un nome file dalla lista viene fatto partire DescriptionActivity, poi DescriptionFragment e la sequenza in quest'ultimo è onCreate, onCreateView, onActivityCreated. Cambiando orientamento si passa prima per la onSaveInstanceState, quindi viene iniziato nuovamente il giro, quindi viene fatta partire DescriptionActivity, poi DescriptionFragment con la stessa sequenza onCreate, onCreateView, onActivityCreated.

Avete idee sul motivo per il quale non riesco a recuperare il valore salvato nel Bundle?
Eventualmente potreste indicarmi un esempio funzionante dal quale prendere spunto?

Grazie.

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:Fragment & proseguimento video al cambio orientamento
« Risposta #1 il: 05 Agosto 2014, 13:15:36 CEST »
+1
Leggendo su google, il tuo problema dovrebbe essere questo: tu salvi effettivamente lo stato del fragment, però lo stato viene distrutto insieme all'activity che lo contiene.

Una possibile soluzione è quella di implementare il salvataggio nella OnSaveInstanceState() a livello di activity, magari salvando tutto il fragment:

Codice (Java): [Seleziona]
public void onSaveInstanceState(Bundle outState){
    getFragmentManager().putFragment(outState,"myfragment",myfragment);
}

public void onRetoreInstanceState(Bundle inState){
    myFragment = getFragmentManager().getFragment(inState,"myfragment");
}
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline wlf

  • Utente normale
  • ***
  • Post: 319
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:Fragment & proseguimento video al cambio orientamento
« Risposta #2 il: 05 Agosto 2014, 15:16:46 CEST »
0
Leggendo su google, il tuo problema dovrebbe essere questo: tu salvi effettivamente lo stato del fragment, però lo stato viene distrutto insieme all'activity che lo contiene.

Il sospetto che venisse distrutto ce l'avevo anche io ... visto che veniva eseguita nuovamente la onCreate della DescriptioActivity. :(

Citazione
Una possibile soluzione è quella di implementare il salvataggio nella OnSaveInstanceState() a livello di activity, magari salvando tutto il fragment:

Ho provato come hai suggerito, la onSaveInstanceState ho dovuto modificarla come sotto riportato altrimenti mi dava errore "The method putFragment(Bundle, String, Fragment) in the type FragmentManager is not applicable for the arguments (Bundle, String,  DescriptionFragment)"

Codice (Java): [Seleziona]
        public void onSaveInstanceState(Bundle outState){
            getSupportFragmentManager().putFragment(outState, "myfragment", descriptionFragment);
        }

Per la onRetoreInstanceState invece non ne sono ancora venuto a capo; continua a dirmi "Type mismatch: cannot convert from Fragment to DescriptionFragment" ma non ho ancora trovato una soluzione. :(
Codice (Java): [Seleziona]
        public void onRetoreInstanceState(Bundle inState){
            descriptionFragment = getSupportFragmentManager().getFragment(inState,"myfragment");
        }

Mi sfugge perché non consideri una Fragment la DescriptionFragment che è dichiarata come estinsione della Fragment. :(

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:Fragment & proseguimento video al cambio orientamento
« Risposta #3 il: 05 Agosto 2014, 16:21:04 CEST »
0
Il type mismatch potresti averlo nel caso in cui tu stia mischiando Fragment veri e propri con quelli della support library.

Controllo gli import del tuo DescriptionFragment.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline wlf

  • Utente normale
  • ***
  • Post: 319
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:Fragment & proseguimento video al cambio orientamento
« Risposta #4 il: 05 Agosto 2014, 18:01:18 CEST »
0
Il type mismatch potresti averlo nel caso in cui tu stia mischiando Fragment veri e propri con quelli della support library.
Controllo gli import del tuo DescriptionFragment.

E' stata proprio una delle principali cose che ho controllato; nella DescriptionFragment ho:

Codice (Java): [Seleziona]
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.MediaController;
import android.widget.TextView;
import android.widget.VideoView;

Mentre nella DescriptionActivity ho:

Codice (Java): [Seleziona]
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.util.Log;

Mi sfugge che cosa gli faccia difetto ... :(

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:Fragment & proseguimento video al cambio orientamento
« Risposta #5 il: 05 Agosto 2014, 18:18:41 CEST »
0
Ma nella DescriptionActivity, l'oggetto descriptionFragment che tipo di fragment è?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline wlf

  • Utente normale
  • ***
  • Post: 319
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:Fragment & proseguimento video al cambio orientamento
« Risposta #6 il: 05 Agosto 2014, 18:30:01 CEST »
0
Ma nella DescriptionActivity, l'oggetto descriptionFragment che tipo di fragment è?

E' di tipo DescriptionFragment, è dichiarato:
Codice (Java): [Seleziona]
DescriptionFragment descriptionFragment = (DescriptionFragment) getSupportFragmentManager().findFragmentById(R.id.descriptionFragment);
La DescriptionFragment è dichiarata:
Codice (Java): [Seleziona]
public class DescriptionFragment extends Fragment

Riguardandomi il codice dell'esempio originale di GitHub mi sfugge dove sia la parte del codice che dice che in Portrait di caricare solamente la listView con l'elenco delle voci selezionabili e quando in Landscape deve visualizzare la lista e a fianco il dettaglio. Mi sfugge questo passaggio che a mio avviso potrebbe essere la chiave il responsabile del comportamento che mi impedisce di venire a capo del problemino che ho posto. ;)
« Ultima modifica: 06 Agosto 2014, 10:40:39 CEST da wlf »