Autore Topic: Lag Navigation Drawer  (Letto 1210 volte)

Offline marcolinoct_89

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Lag Navigation Drawer
« il: 01 Luglio 2013, 13:06:56 CEST »
0
Buongiorno a tutti e grazie anticipatamente a chiunque leggerà questo post e cercherà di aiutarmi.
Sto creando un'app che utilizza il Navigation Drawer per aprire diverse schermate.
Ogni selezione nella lista del N.D. fa in modo che il fragment correntemente visualizzato venga sostituito da un altro fragment.
Funziona tutto ma quando il fragment da inserire è una mappa il rientro del navigation drawer è laggoso, molto probabilmente a causa del download della mappa stessa dai server google.
Lo scatto è irrisorio ma pur sempre fastidioso.
Qualunque altro fragment inserisco invece non mi da problemi.
Di seguito il codice che uso per il click su un elemento del N.D.


Codice (Java): [Seleziona]
mDrawerList.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent,
                View view,
                int position,
                long id) {
 
                Fragment rFragment = new AroundMe();
                   
                    String[] title = getResources().getStringArray(R.array.title);
 
                    //Currently selected river
                    mTitle = title[position];
                   
                    switch(position){
                        case 0:
                                rFragment= new ListaRisto();
                                break;
                        case 1:
                                rFragment= new AroundMe();
                                break;
                        case 2:
                                rFragment = new Discovery();
                                break;
                    }

                    // Getting reference to the FragmentManager
                    FragmentManager fragmentManager = getFragmentManager();
 
                    // Creating a fragment transaction
                    FragmentTransaction ft = fragmentManager.beginTransaction();
                     
                    // Adding a fragment to the fragment transaction
                    ft.replace(R.id.content_frame, rFragment);
 
                    // Committing the transaction
                    ft.commit();
 
                    // Closing the drawer
                    mDrawerLayout.closeDrawer(mDrawerList);
                   
            }
        });
    }
« Ultima modifica: 01 Luglio 2013, 13:10:39 CEST da marcolinoct_89 »

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Lag Navigation Drawer
« Risposta #1 il: 01 Luglio 2013, 14:15:30 CEST »
0
Ciao, se vuoi che il ND si chiude appena scegli, una soluzione sarebbe spostare la chiamata mDrawerLayout.closeDrawer(mDrawerList); all'inizio del listener

Offline marcolinoct_89

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Lag Navigation Drawer
« Risposta #2 il: 01 Luglio 2013, 14:37:09 CEST »
0
Ciao, se vuoi che il ND si chiude appena scegli, una soluzione sarebbe spostare la chiamata mDrawerLayout.closeDrawer(mDrawerList); all'inizio del listener

già provato ma lagga ugualmente.
Io pensavo a qualcosa che rendeva possibile un download a posteriori delle mappe ma non ho trovato nulla.

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Lag Navigation Drawer
« Risposta #3 il: 01 Luglio 2013, 14:43:50 CEST »
0
ma in che senso lagga? non si chiude subito il drawer? (in effetti non l'ho ancora provato)

Offline marcolinoct_89

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Lag Navigation Drawer
« Risposta #4 il: 01 Luglio 2013, 15:13:03 CEST »
0
ma in che senso lagga? non si chiude subito il drawer? (in effetti non l'ho ancora provato)

esatto..fa uno scattino verso la chiusura si blocca in chiusura e dopo si chiude..il tutto dura nemmeno un secondo..ma è fastidioso..

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Lag Navigation Drawer
« Risposta #5 il: 01 Luglio 2013, 15:33:27 CEST »
0

Per portare l'operazione in background, devi creare un AsyncTask che ti rimpiazza il Fragment.

AsyncTask | Android Developers

del doInBackground crei il Fragment

onProgressUpdate puoi anche non chiamarlo...

in onPostExecute fai il replace del fragment

---

Un'altra possibilità è usare un Handler

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Lag Navigation Drawer
« Risposta #6 il: 01 Luglio 2013, 15:39:43 CEST »
+1
Puoi provare a fare una cosa simile (non l'ho testata).
Usi il listener del Drawer. Il replace del fragment non lo fa il listener del click, ma quello del drawer appena chiuso.

Codice (Java): [Seleziona]
mDrawerList.setOnItemClickListener(new OnItemClickListener()
    {
 
        @Override
        public void onItemClick(AdapterView<?> parent,
                View view, final int pos, long id)
        {
            mDrawerLayout.setDrawerListener(
                new DrawerLayout.SimpleDrawerListener()
            {
                @Override
                public void onDrawerClosed(View drawerView)
                {
                    super.onDrawerClosed(drawerView);
                    FragmentTransaction tx =    getSupportFragmentManager().beginTransaction();
                    tx.replace(R.id.main, ....);
                    tx.commit();
                }
            });
            mDrawerLayout.closeDrawer(navList);
        }
    });

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Lag Navigation Drawer
« Risposta #7 il: 01 Luglio 2013, 15:49:03 CEST »
0
Puoi provare a fare una cosa simile (non l'ho testata).
Usi il listener del Drawer. Il replace del fragment non lo fa il listener del click, ma quello del drawer appena chiuso.

Codice (Java): [Seleziona]
mDrawerList.setOnItemClickListener(new OnItemClickListener()
    {
 
        @Override
        public void onItemClick(AdapterView<?> parent,
                View view, final int pos, long id)
        {
            mDrawerLayout.setDrawerListener(
                new DrawerLayout.SimpleDrawerListener()
            {
                @Override
                public void onDrawerClosed(View drawerView)
                {
                    super.onDrawerClosed(drawerView);
                    FragmentTransaction tx =    getSupportFragmentManager().beginTransaction();
                    tx.replace(R.id.main, ....);
                    tx.commit();
                }
            });
            mDrawerLayout.closeDrawer(navList);
        }
    });

Uhm, interessante... si vede che non ho ancora esplorato le nuove API

Offline marcolinoct_89

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Lag Navigation Drawer
« Risposta #8 il: 01 Luglio 2013, 16:11:35 CEST »
0
Puoi provare a fare una cosa simile (non l'ho testata).
Usi il listener del Drawer. Il replace del fragment non lo fa il listener del click, ma quello del drawer appena chiuso.

Codice (Java): [Seleziona]
mDrawerList.setOnItemClickListener(new OnItemClickListener()
    {
 
        @Override
        public void onItemClick(AdapterView<?> parent,
                View view, final int pos, long id)
        {
            mDrawerLayout.setDrawerListener(
                new DrawerLayout.SimpleDrawerListener()
            {
                @Override
                public void onDrawerClosed(View drawerView)
                {
                    super.onDrawerClosed(drawerView);
                    FragmentTransaction tx =    getSupportFragmentManager().beginTransaction();
                    tx.replace(R.id.main, ....);
                    tx.commit();
                }
            });
            mDrawerLayout.closeDrawer(navList);
        }
    });

cosi però se apro e chiudo il drawer senza selezionare qualcosa mi fa sempre la FragmentTransaction..anche se sarebbe ovviabile mettendo un controllo sul fatto se la chiusura avviene dopo una selezione o dopo una semplice apertura del drawer..adesso non posso ma non appena mi libero provo a fare cosi con un controllo e vi faccio sapere..grazie mille a tutti per le risposte in ogni caso :)



EDIT: l'ho implementato così, nella chiusura del drawer..lo scatto non c'è più però l'effetto che si viene a creare non è il massimo..prima si chiude TUTTO il drawer e poi inserisce il fragment.
Purtroppo la soluzione che vorrei io, ovvero il download delle mappe da google a posteriori in modo che spunta il fragment con il download delle mappe che parte dopo, non l'ho trovato :(
Oggi provo a implementare la soluzione col task asincrono..vediamo se li è fattibile come cosa anche se già a livello " teorico " penso si comporti come sul fatto del cambiare fragment dopo la chiusura del drawer.


EDIT2: ho fatto la prova con il task asincrono ma niente da fare.. adesso invece provo facendo l'innesto di un fragment dentro un fragment da codice..visto che il caricamento è lento lo provo a posticipare inserendo il fragment con la mappa SOLO DOPO la creazione del mio fragment "contenitore". Per chi fosse interessato qui si parla dei Nested Fragment che sono i fragment dentro altri fragment -->  http://developer.android.com/about/versions/android-4.2.html#NestedFragments



P.S. mi è sorto un altro problema, che penso sia dovuto a una questione di ignoranza ancora verso alcuni aspetti di android. Come faccio a mantenere la sessione del fragment che cambio con la FragmentTransaction? in poche parole voglio che quando clicco su un elemento del drawer che ho già visualizzato riprenda quello e non lo crei di nuovo richiamando quindi la onCreate. Se sto andando troppo fuori topic apro un altro post. Grazie a tutti.
« Ultima modifica: 02 Luglio 2013, 16:27:24 CEST da marcolinoct_89 »

Offline marcolinoct_89

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Lag Navigation Drawer
« Risposta #9 il: 08 Luglio 2013, 17:05:11 CEST »
0
Ho risolto.
Semplicemente creo tutti i fragment nella onCreate della Activity, li aggiungo tutti ad una FragmentTransaction e poi faccio l'hide di quelli che non mi interessano.
Quando clicco su un elemento del navigation drawer metto in hide quelli che non mi interessano e faccio show di quello che voglio visualizzare.

Posto le parti salienti di tutto il discorso a livello di codice

Precisamente nella onCreate:

Codice (Java): [Seleziona]
        rFragment = new ListaRisto();
        mFragment=new AroundMe();
        // Getting reference to the FragmentManager
        FragmentManager fragmentManager = getFragmentManager();

        // Creating a fragment transaction
        ft = fragmentManager.beginTransaction();
         //Add fragment in the transaction
        ft.add(R.id.content_frame, rFragment);
        ft.add(R.id.content_frame, mFragment);

        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        //hide the fragment
        ft.hide(mFragment);
        // Committing the transaction
        ft.commit();


mentre nel listener del drawer:

Codice (Java): [Seleziona]
switch(position){
                        case 0:
                        FragmentManager fragmentManager = getFragmentManager();
                         
                        // Creating a fragment transaction
                        FragmentTransaction ft1 = fragmentManager.beginTransaction();
                        ft1.hide(mFragment);
                        ft1.show(rFragment);
                        ft1.commit();
                        mDrawerLayout.closeDrawer(mDrawerList);
                        return;
                        case 1:
                        FragmentManager fragmentManager2 = getFragmentManager();
                         
                        // Creating a fragment transaction
                        FragmentTransaction ft2 = fragmentManager2.beginTransaction();
                        ft2.hide(rFragment);
                        ft2.show(mFragment);
                        ft2.commit();
                        mDrawerLayout.closeDrawer(mDrawerList);
                        return;