Autore Topic: Fragment Retained e approccio con controlli caricati dinamicamente  (Letto 476 volte)

Offline ratal

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 5
  • Sistema operativo:
    kitkat
0
Ciao a tutti,
mi trovo in questa situazione:
Ho un fragment nel quale carico dinamicamente alcuni controlli all'interno del layout principale dello stesso.
Nei controlli ci sono delle edittext che, come purtroppo sappiamo, perdono il loro valore nel momento in cui ruoto lo schermo. Appurato che i dettami di google sconsiglino di intervenire sul manifest, mi sono buttato sul setRetainInstance(true).
Il problema è che i controlli dinamici sono costretto a caricarli nell'evento OnCreateView del fragment, il quale scatta comunque sempre, a prescindere dal fatto che il fragment sia salvato in memoria o nuovo. Qual'è il giusto approccio per caricarli solo la prima volta?
Spero di non dovermi salvare in memoria i valori di tutte le edittext e ripopolarle a mano all'interno dell'OnCreateView. Non voglio credere che non esista una soluzione meno contorta.
grazie mille

La mia activity
Codice (Java): [Seleziona]
@Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_newmessage);

                FragmentManager fragmentManager = getSupportFragmentManager();
                fragment = (AnswerFragment) fragmentManager
                                .findFragmentByTag("test_fragment");
                // Creating a fragment transaction
                FragmentTransaction ft = fragmentManager.beginTransaction();

                if (fragment == null) {
                                //Se il fragment non è salvato in memoria lo creo
                                fragment = new AnswerFragment();
                                ft.add(R.id.lnlNewMessage_content, fragment, "test_fragment");
                                invalidateOptionsMenu();

                }
                // Committing the transaction
                ft.commit();

                }

        }

Nel fragment faccio le mie operazioni al'interno dell'evento oncreateview per avere il riferimento della visione principale.

Codice (Java): [Seleziona]
@Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {

                // create ContextThemeWrapper from the original Activity Context with
                // the custom theme

                final Context contextThemeWrapper = new ContextThemeWrapper(
                                getActivity(), ThemeUtils.getTemaAttivo());

                // clone the inflater using the ContextThemeWrapper
                LayoutInflater localInflater = inflater
                                .cloneInContext(contextThemeWrapper);

                // inflate the layout using the cloned inflater, not default inflater
                View rootView = localInflater.inflate(R.layout.fragment_answer,
                                container, false);

                [....]
                //EFFETTO UNA SERIE DI OPERAZIONI CHE CREANO DINAMICAMENTE CONTROLLI ALL'INTERNO DEL LAYOUT CONTOL
                [....]
               
                return rootView;

        }

Offline iClaude

  • Utente normale
  • ***
  • Post: 221
  • Respect: +14
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Fragment Retained e approccio con controlli caricati dinamicamente
« Risposta #1 il: 26 Ottobre 2015, 11:47:23 CET »
0
In teoria se usi un layout statico per i Fragment, anche diverso a seconda dell'orientamento del display ma con id degli EditText uguali e unici, i valori inseriti dall'utente dovrebbero essere mantenuti. Non serve un retained Fragment.
Nel tuo caso probabilmente il problema deriva dal fatto che crei i componenti dinamicamente. In questo caso non vedrei altra soluzione che salvare i valori e reimpostarli.

PS. Cmq il codice della tua Activity andrebbe sistemato: che senso ha creare la transaction ed eseguirla al di fuori del blocco if?
« Ultima modifica: 26 Ottobre 2015, 14:09:16 CET da iClaude »

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:Fragment Retained e approccio con controlli caricati dinamicamente
« Risposta #2 il: 26 Ottobre 2015, 19:07:23 CET »
0
hai provato inserendo il setRetainInstance nell onCreate del fragment ?
Codice (Java): [Seleziona]
public class Statistiche extends Fragment {
   
    public static Fragment newInstance() {
        Fragment fragment = new Statistiche();
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
        setHasOptionsMenu(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragmentlayout, container, false);
        // tuo codice ....
        return rootView;
    }
   
}

una cosa del genere

Offline ratal

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 5
  • Sistema operativo:
    kitkat
Re:Fragment Retained e approccio con controlli caricati dinamicamente
« Risposta #3 il: 27 Ottobre 2015, 00:19:44 CET »
0
hai provato inserendo il setRetainInstance nell onCreate del fragment ?
Codice (Java): [Seleziona]
public class Statistiche extends Fragment {
   
    public static Fragment newInstance() {
        Fragment fragment = new Statistiche();
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
        setHasOptionsMenu(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragmentlayout, container, false);
        // tuo codice ....
        return rootView;
    }
   
}

una cosa del genere

Come scritto sopra uso già il setretainistance

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:Fragment Retained e approccio con controlli caricati dinamicamente
« Risposta #4 il: 27 Ottobre 2015, 00:50:38 CET »
0
Come scritto sopra uso già il setretainistance
Utilizzi il navigationdrawer ?

Inviato dal mio SM-N9005 utilizzando Tapatalk


Offline ratal

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 5
  • Sistema operativo:
    kitkat
Re:Fragment Retained e approccio con controlli caricati dinamicamente
« Risposta #5 il: 27 Ottobre 2015, 06:42:00 CET »
0
Si

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:Fragment Retained e approccio con controlli caricati dinamicamente
« Risposta #6 il: 27 Ottobre 2015, 10:11:29 CET »
0
Mi sono messo a leggere un po' in giro e da quello che vedo quando aggiungi gli oggetti edittext ecc da Java ... Al cambio di orientamento devi utilizzare per forza onSavedInstance e salvare i dati , per poi recuperarli nel onCeateView ... Che sembra essere il miglior approccio ... Poi c'è anche chi sfrutta onConfigurationChanged ... tempo a dietro mi parlarono anche di fragment statici ma mai approfondito perché fortemente sconsigliati .... Io opterei per onSavedInstance .... Saluti

Offline ratal

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 5
  • Sistema operativo:
    kitkat
Re:Fragment Retained e approccio con controlli caricati dinamicamente
« Risposta #7 il: 27 Ottobre 2015, 10:36:58 CET »
0
Mi sono messo a leggere un po' in giro e da quello che vedo quando aggiungi gli oggetti edittext ecc da Java ... Al cambio di orientamento devi utilizzare per forza onSavedInstance e salvare i dati , per poi recuperarli nel onCeateView ... Che sembra essere il miglior approccio ... Poi c'è anche chi sfrutta onConfigurationChanged ... tempo a dietro mi parlarono anche di fragment statici ma mai approfondito perché fortemente sconsigliati .... Io opterei per onSavedInstance .... Saluti
Si infatti è l'altro approccio al retaininstance. Per ora provo col retain: il fragment è retained quindi mantiene in memoria i dati se glieli salvo in una variabile, quindi credo sia l'equivalente dell savedinstance.
Verifico entrambe le alternative.
Purtroppo mi sembrano tutti accrocchi ma non c'è alternativa  :'( :'(

Offline iClaude

  • Utente normale
  • ***
  • Post: 221
  • Respect: +14
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Fragment Retained e approccio con controlli caricati dinamicamente
« Risposta #8 il: 27 Ottobre 2015, 10:46:39 CET »
0
Se usi onSaveInstanceState non devi usare un retained Fragment, altrimenti il bundle passato sarà null.
Usa semplicemente un normale Fragment , lascia che venga distrutto e ricreato e salva i valori in onSaveInstanceState