Autore Topic: [facile] come utilizzare il nuovo Navigation Drawer  (Letto 31155 volte)

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
[facile] come utilizzare il nuovo Navigation Drawer
« il: 27 Maggio 2013, 13:35:38 CEST »
+14
Livello di difficoltà: facile
Target SDK: 18
Min SDK: 4 (11 se si utilizza anche la ActionBar, 7 se si utilizza la ActionBarCompat)
Link al file compresso del progetto eclipse: file in allegato

Il tutorial descrive il nuovo componente Navigation Drawer introdotto da Google.

Cosa è il Drawer Navigation
Nel recente Google I/O 2013 Google ha introdotto un nuovo componente, il Navigation Drawer.
Non si tratta di una novità assoluta nel mondo Android. Già da tempo e in molte applicazioni sono utilizzati componenti simili che svolgono essenzialmente la funzione di "menù" laterale.
Le stesse applicazioni Google, fino ad oggi implementavano in modo diverso e non uniforme questa funzionalità.
Esistono diverse librerie, non Google, che permettono di realizzare facilemente e in modo valido la navigazione laterale.

Dove sono le novità
Ci sono delle novità che sono sostanziose:
  • Esiste una linea guida ufficiale
  • La modalità di rilascio
  • Google sta adeguando le sue app
Vediamole nel dettaglio.
Google ha, finalmente, definito una linea guida ufficiale che potete trovare qui.
Fra gli elementi che ritengo importante, ha evidenziato in maniera molto chiara come realizzare la navigazione fra livelli, l'ActionBar deve rimanere fissa e non scorrere ma si deve prestare attenzione alle icone contestuali che vengono mostrate, ha anche stabilito le dimensioni da utilizzare per il componente.
Da sempre il punto di forza di Android sta nella possibilità di personalizzare i propri componenti. Allo stesso tempo ritengo fondamentale seguire le linee guida.
Utilizzare pattern condivisi, significa fornire all'utente una UI che sa già utilizzare, dove non deve imparare nulla, e dove non deve scoprire comportamenti difformi dalle altre app che si trovano nel Google Play. Trovarsi di fronte una applicazione in cui l'utente non sa muoversi, porta spesso ed inevitabilmente alla sua prematura disinstallazione.

Se siete interessati, uno degli autori Google del componente ha scritto una miniserie su G+ in cui vengono dettagliati il perchè di certe scelte.
Parte 1
Parte 2
Parte 3
Parte 4

L'altra novità sostanziale è nella modalità di rilascio.
Google ha inserito il nuovo componente all'interno della support library.
Questa scelta è decisamente importante, garantendo in questo modo la possibilità di utilizzare, da subito, il componente per la quasi totalità dei device in circolazione.

Infine, Google, forse per la prima volta sta rapidamente uniformando tutte le sue apps con il nuovo componente, seguendo fedelmente le linee guida proposte.
Al momento in cui scrivo, Google Earth, Google Music, Google books, Google Drive e Google Shopper (non presente nel nostro paese) hanno già implementato il nuovo componente.
Questo aspetto è decisamente importante. Se Google adotta il componente nelle sue app la sua diffusione aumenterà rapidamente e diventerà per l'utente molto presto un elemento familiare.

Come implementarlo: modifichiamo il layout
L'implemtazione del nuovo componente è semplice.
Innanzitutto dobbiamo aggiornare la support library alla versione 13 (come detto sopra il nuovo componente è stato rilasciato con la nuova support library)

Il primo passo è modificare il proprio layout e inserire il DrawerLayout.
Codice (XML): [Seleziona]
<android.support.v4.widget.DrawerLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/drawer_layout"
   android:layout_width="match_parent"
   android:layout_height="match_parent" >

    <!-- The main content view -->

    <RelativeLayout
       xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:tools="http://schemas.android.com/tools"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:paddingBottom="@dimen/activity_vertical_margin"
       android:paddingLeft="@dimen/activity_horizontal_margin"
       android:paddingRight="@dimen/activity_horizontal_margin"
       android:paddingTop="@dimen/activity_vertical_margin"
       tools:context=".MainActivity" >

        <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@string/drawer_text" ></TextView>
    </RelativeLayout>

    <!-- The navigation drawer -->

    <ListView
       android:id="@+id/drawer"
       android:layout_width="320dp"
       android:layout_height="match_parent"
       android:layout_gravity="start"
       android:background="#F3F3F4"
       android:choiceMode="singleChoice"
       android:divider="@android:color/transparent"
       android:dividerHeight="0dp" ></ListView>

</android.support.v4.widget.DrawerLayout>



E' importante notare alcuni aspetti.
  • La view principale deve essere il primo elemento all'interno del Drawer (nell'esempio sopra il RelativeLayout)
  • La dimensione del drawer dovrebbe essere fra 240dp e 320dp. Questa condizione non è vincolante ma decisamente consigliata
  • L'altezza del drawer deve essere match_parent
  • La view del navigation (in questo caso il ListView) deve specificare la sua gravità attraverso l'attributo android:layout_gravity

La modifica del solo layout è sufficiente per avere funzionante il Navigation Drawer.

Nel nostro esempio, implementiamo per semplicità all'interno dell'Activity l'Adapter che popola la ListView.
Codice (Java): [Seleziona]
   .....
   
   @Override
   protected void onCreate(Bundle savedInstanceState) {
 
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main_drawer);
       _initMenu();

   }

   private void _initMenu() {
       NsMenuAdapter mAdapter = new NsMenuAdapter(this);

        // Add Header
        mAdapter.addHeader(R.string.ns_menu_main_header);
        .....
        mAdapter.addItem(mItem);
 
 
        mDrawerList = (ListView) findViewById(R.id.drawer);
        if (mDrawerList != null)
            mDrawerList.setAdapter(mAdapter);
   
  }

Mandando in esecuzione il nostro codice abbiamo già il Navigation Drawer.



Aggiungiamo alcune funzionalità al nostro componente. Implementiamo il click sul singolo item.

Innanzitutto dobbiamo aggiungere alla nostra lista un listener.
Codice (Java): [Seleziona]
   private void _initMenu() {
      .....
      mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
   }

Quindi implementiamo il listener in questione:
Codice (Java): [Seleziona]
   private class DrawerItemClickListener implements ListView.OnItemClickListener {

       @Override
       public void onItemClick(AdapterView parent, View view, int position,long id) {
         
          // Highlight the selected item, update the title, and close the drawer
          // update selected item and title, then close the drawer
          mDrawerList.setItemChecked(position, true);
          setTitle("......");

          String text= "menu click... should be implemented";
          Toast.makeText(MainActivity.this, text , Toast.LENGTH_LONG).show();
          mDrawer.closeDrawer(mDrawerList);
   
       }
  }

Su questo punto vale la pena fare una considerazione.
Allo stato attuale, si userà questo codice per switchare il fragment all'interno dell'activity (inserendo quello relativo all'item cliccato). Qui nasce un piccolo problema.
L'animazione del drawer (che si chiude) e quella del FragmentTransaction (che popola il fragment) possono sovrapporsi. Le FragmentTransaction API in questo momento non gestiscono questa casistica.

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

Aggiungiamo la nuova icona in ActionBar e la gestione apertura/chiusura del Drawer
Nelle nuove linee guida è specificato di utilizzare una icona nuova, che si differenzia dall'UP a cui eravamo abituati, nel momento in cui c'è un Navigation Drawer.
Innanzitutto l'icona può essere facilmente scaricata da questo link dove c'è uno zip contenente le nuove icone in tema holo light e dark.

Non è scritto nella guida ufficiale, ma sembra che il nome dell'icona sia per il momento hamburger.

Innanzitutto dobbiamo abilitare il pulsante:
Codice (Java): [Seleziona]
     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main_drawer);

          // enable ActionBar app icon to behave as action to toggle nav drawer
          getActionBar().setDisplayHomeAsUpEnabled(true);
          getActionBar().setHomeButtonEnabled(true);

    }

Dopo di che dobbiamo implementare la nuova classe ActionBarDrawerToggle:
Codice (Java): [Seleziona]
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main_drawer);

          // enable ActionBar app icon to behave as action to toggle nav drawer
          getActionBar().setDisplayHomeAsUpEnabled(true);
          getActionBar().setHomeButtonEnabled(true);

          mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);
          mDrawerToggle = new CustomActionBarDrawerToggle(this, mDrawer);
          mDrawer.setDrawerListener(mDrawerToggle);
    }


    private class CustomActionBarDrawerToggle extends ActionBarDrawerToggle {

          public CustomActionBarDrawerToggle(Activity mActivity,DrawerLayout mDrawerLayout){
                super(
                      mActivity,               /* host Activity */
                      mDrawerLayout,           /* DrawerLayout object */
                      R.drawable.ic_drawer,    /* nav drawer icon to replace 'Up' caret */
                      R.string.ns_menu_open,   /* "open drawer" description */
                      R.string.ns_menu_close); /* "close drawer" description */
          }


          /** Called when a drawer has settled in a completely closed state. */
          @Override
          public void onDrawerClosed(View view) {
               getActionBar().setTitle(getString(R.string.ns_menu_close));
          }

          /** Called when a drawer has settled in a completely open state. */
          @Override
          public void onDrawerOpened(View drawerView) {
               getActionBar().setTitle(getString(R.string.ns_menu_open));
          }
    }

Questa classe ci permette di specifica attraverso i metodi onDrawerClosed e onDrawerOpened cosa eseguire quando la chiusura e l'apertura del Drawer è completata, e attraverso il suo costruttore quale icona utilizzare.

Ecco qui due immagini che evidenziano la nuova icona e  il titolo modificato in apertura.




E' importante anche gestire il click sulla nuova icona, per far aprire il Drawer.
Codice (Java): [Seleziona]
   @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Pass the event to ActionBarDrawerToggle, if it returns
        // true, then it has handled the app icon touch event
        if (mDrawerToggle.onOptionsItemSelected(item)) {
          return true;
        }
        // Handle your other action bar items...

        return super.onOptionsItemSelected(item);
    }

Per poter funzionare correttamente vanno anche implementati questi metodi:
Codice (Java): [Seleziona]
    @Override
        protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

Infine è molto importante gestire le icone della ActionBar
Come specificato nella guida dobbiamo togliere le icone che sono contestuali alla gestione aperta per evitare confusioni agli utenti.
Contemporaneamente dobbiamo reinserire le icone in fase di chiusura del drawer.
Per poter realizzare questo comportamente agiamo sulla classe ActionBarDrawerToggle
Codice (Java): [Seleziona]
    private class CustomActionBarDrawerToggle extends ActionBarDrawerToggle {

        @Override
        public void onDrawerClosed(View view) {
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()  
        }

        @Override
        public void onDrawerOpened(View drawerView) {
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        }
    }

    /* Called whenever we call invalidateOptionsMenu() */
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        // If the nav drawer is open, hide action items related to the content view
        boolean drawerOpen = mDrawer.isDrawerOpen(mDrawerList);
        menu.findItem(R.id.action_save).setVisible(!drawerOpen);
        return super.onPrepareOptionsMenu(menu);
    }

Il miglior modo è chiamare il metodoinvalidateOptionsMenu che lancia il onPrepareOptionsMenu.
Qui dentro possiamo speficare cosa nascondere e rendere visibile di volta in volta.

NavigationDrawer e ActionBarSherlock
Una precisazione importante.
Per chi lavora con la SherlockActionBar, attualmente il Drawer non è perfettamente compatibile per via della ActionBarDrawerToggle. Esiste già una implementazione di questa classe funzionante con ABS e la potete trovare qui.
L'implementazione non è ancora stata inserita nella library ufficiale di ABS. (per via della support library che non è presente nel maven centrale, speriamo lo sia presto).

NavigationDrawer e ActionBarCompat
Se si vuole utilizzare il NavigationDrawer con API<11 si può facilmente integrare con la ActionBarCompat (API >=7).
Valgono tutte le considerazioni viste in precedenza.
Vanno adottati alcuni accorgimenti:
  • l'Activity deve estendere ActionBarActivity.
  • il metodo getActionBar() va sostituito con getSupportActionBar()
  • il metodo invalidateOptionsMenu() va sostituito con supportInvalidateOptionsMenu()






Il componente è appena uscito, è probabile che alcune delle considerazione fatte possa cambiare nel futuro.
Cercherò di tenere aggiornata la guida nel tempo.

I sorgenti del progetto Navigation Drawer li trovate aggiornati su GitHub :NavigationDrawer

* A questo repository vanno aggiunte la Support Library-v4 -ver 13/18.

Se usate Eclipse:
Aggiungete la android-support-v4.jar (v13/18) a libs.

Se usate AndroidStudio aggiungete al vostro build.gradle
dependencies {
    // Support Libraries
    compile 'com.android.support:support-v4:18.0.0'
 }


I sorgenti del progetto Navigation Drawer con l'ActionBarCompat li trovate aggiornati su GitHub :NavigationDrawer & ActionBarCompat

* A questo repository vanno aggiunte la Support Library-v4 -ver 13/18 e la support-appcompatv7.

Se usate Eclipse:
Aggiungete la android-support-v4.jar (v13/18) a libs.
Aggiungete la compatv7 come libraria android seguendo queste istruzioni: Support Library Setup | Android Developers

Se usate AndroidStudio aggiungete al vostro build.gradle
dependencies {
    // Support Libraries
    compile 'com.android.support:support-v4:18.0.0'
    compile 'com.android.support:appcompat-v7:18.0.0'
}

Bibliografia:
« Ultima modifica: 05 Ottobre 2013, 18:22:14 CEST da GabMarioPower »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:[facile] come utilizzare il nuovo Navigation Drawer
« Risposta #1 il: 27 Maggio 2013, 15:40:35 CEST »
0
Impeccabile, come al solito :)

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:[facile] come utilizzare il nuovo Navigation Drawer
« Risposta #2 il: 27 Maggio 2013, 15:57:28 CEST »
0
fantastico, peccato per il mancato supporto all'ABS!
Sarebbe forte anche un esempio con SlidingPaneLayout, l'ho dovuto modificare per farlo funzionare con il pane di destra draggabile. Hai percaso provato se il navigation drawer funziona con pannelli draggabili orizzontalmente?
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

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:[facile] come utilizzare il nuovo Navigation Drawer
« Risposta #3 il: 27 Maggio 2013, 16:34:11 CEST »
0
fantastico, peccato per il mancato supporto all'ABS!
Sarebbe forte anche un esempio con SlidingPaneLayout, l'ho dovuto modificare per farlo funzionare con il pane di destra draggabile. Hai percaso provato se il navigation drawer funziona con pannelli draggabili orizzontalmente?

Sullo SlidingPaneLayout ci sto lavorando.... se trovo il tempo scriverò anche di quello.
Per quanto riguarda il Navigation Drawer, onestamente non l'ho provato con quel tipo di pannelli,dovrei provare.

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:[facile] come utilizzare il nuovo Navigation Drawer
« Risposta #4 il: 27 Maggio 2013, 16:45:27 CEST »
0
Sullo SlidingPaneLayout ci sto lavorando.... se trovo il tempo scriverò anche di quello.
Per quanto riguarda il Navigation Drawer, onestamente non l'ho provato con quel tipo di pannelli,dovrei provare.
io avevo il problema con SPL che usando due fragment (custom a sinistra, mapFragment a destra), non funzionava più lo slide orizzontale sulla mappa, perchè SPL si mangiava gli eventi. Grazie a RomanNurik e al codice della supportlibrary ho scoperto che ViewDragHelper utilizzato da SPL per capire se la vista di destra è scrollabile, richiama dei metodi che non danno true in caso di mapFragment. Al momento (per velocità) ho fatto che se l'id della view di destra (o delle sottoview) è uguale ad un valore fisso, oppure se la view ha un tag con l'id che è sempre questo valore fisso di tipo Boolean ed è true, allora quella view va considerata horizonally scrollable e quindi il drag va delegato.
Quando ho tempo cerco un metodo più cristiano per capire come fare, dato per assodato che "myView instanceof MapView" non da mai true...
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:[facile] come utilizzare il nuovo Navigation Drawer
« Risposta #5 il: 27 Maggio 2013, 17:31:21 CEST »
0
fantastico, peccato per il mancato supporto all'ABS!

Puoi sempre utilizzare questo fork: https://github.com/ianhanniballake/ActionBarSherlock

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:[facile] come utilizzare il nuovo Navigation Drawer
« Risposta #6 il: 29 Maggio 2013, 10:18:01 CEST »
0
io avevo il problema con SPL che usando due fragment (custom a sinistra, mapFragment a destra), non funzionava più lo slide orizzontale sulla mappa, perchè SPL si mangiava gli eventi. Grazie a RomanNurik e al codice della supportlibrary ho scoperto che ViewDragHelper utilizzato da SPL per capire se la vista di destra è scrollabile, richiama dei metodi che non danno true in caso di mapFragment. Al momento (per velocità) ho fatto che se l'id della view di destra (o delle sottoview) è uguale ad un valore fisso, oppure se la view ha un tag con l'id che è sempre questo valore fisso di tipo Boolean ed è true, allora quella view va considerata horizonally scrollable e quindi il drag va delegato.
Quando ho tempo cerco un metodo più cristiano per capire come fare, dato per assodato che "myView instanceof MapView" non da mai true...

Ho giocato con la SPL. Appena trovo il tempo pubblico qualcosa.
MapFragment a parte, sul resto non ho notato grandi problemi.
E' chiaro però quando il pannello di sinistra è chiuso, l'utente ha un funzionamento un po forzato con due pannelli con scorrono e diventa fondamentale dove mettono il dito per farlo scorrere (sul bordo vince il Drawer, sul resto c'è solo il SPL).
L'altra cosa su cui dover fare dei workaround sono le icone "up" e "hamburger" e le optionsmenu.







Offline darko

  • Nuovo arrivato
  • *
  • Post: 26
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy s4
  • Sistema operativo:
    Windows 7
Re:[facile] come utilizzare il nuovo Navigation Drawer
« Risposta #7 il: 09 Giugno 2013, 16:15:37 CEST »
0
mi dà errore del dichiarare l'NsMenuAdapter...mi dice NsMenuAdapter non può essere risolto come un tipo (- NsMenuAdapter cannot be resolved to a type)

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:[facile] come utilizzare il nuovo Navigation Drawer
« Risposta #8 il: 09 Giugno 2013, 16:31:38 CEST »
0
mi dà errore del dichiarare l'NsMenuAdapter...mi dice NsMenuAdapter non può essere risolto come un tipo (- NsMenuAdapter cannot be resolved to a type)

E' un banale adapter.
Il sorgente lo trovi nel link  in fondo all'articolo.

Offline darko

  • Nuovo arrivato
  • *
  • Post: 26
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy s4
  • Sistema operativo:
    Windows 7
Re:[facile] come utilizzare il nuovo Navigation Drawer
« Risposta #9 il: 09 Giugno 2013, 17:11:05 CEST »
0
E' un banale adapter.
Il sorgente lo trovi nel link  in fondo all'articolo.

mi continua a dare errori anche dopo aver ricopiato tutto il sorgente in ogni sua parte...non ci capisco più niente..

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:[facile] come utilizzare il nuovo Navigation Drawer
« Risposta #10 il: 09 Giugno 2013, 21:57:10 CEST »
0
mi continua a dare errori anche dopo aver ricopiato tutto il sorgente in ogni sua parte...non ci capisco più niente..

Se posti gli errori possiamo aiutarti.
RIcordati che per funzionare devi inserire nelle libs la support library v13.

Offline darko

  • Nuovo arrivato
  • *
  • Post: 26
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy s4
  • Sistema operativo:
    Windows 7
Re:[facile] come utilizzare il nuovo Navigation Drawer
« Risposta #11 il: 10 Giugno 2013, 00:02:57 CEST »
0
Se posti gli errori possiamo aiutarti.
RIcordati che per funzionare devi inserire nelle libs la support library v13.

era proprio quello il problema  :D grazie mille!!!  :-)

comunque per poter usare il navigation drawer serve per forza avere come minSdk l'API 11?? quindi l'app che faccio con il navigation drawer non potrà essere scaricata da tutti gli android con versione inferiore alla 3.0?? mi sembra un po' brutto...
« Ultima modifica: 10 Giugno 2013, 09:29:31 CEST da darko, Reason: Merged DoublePost »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:[facile] come utilizzare il nuovo Navigation Drawer
« Risposta #12 il: 10 Giugno 2013, 10:16:26 CEST »
0
era proprio quello il problema  :D grazie mille!!!  :-)

comunque per poter usare il navigation drawer serve per forza avere come minSdk l'API 11?? quindi l'app che faccio con il navigation drawer non potrà essere scaricata da tutti gli android con versione inferiore alla 3.0?? mi sembra un po' brutto...

No, il minimo è API Level 8, cioè Android 2.2. E' anche scritto all'inizio del tutorial ;)

Offline stranigiorni

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Google+
    • matteogabella
    • Mostra profilo
    • stranigiorni
  • Dispositivo Android:
    bird v1277
  • Play Store ID:
    Matteo+Gabella
  • Sistema operativo:
    win8
Re:[facile] come utilizzare il nuovo Navigation Drawer
« Risposta #13 il: 10 Giugno 2013, 16:06:44 CEST »
0
ciao e grazie per il tutorial!
ti chiedo una cosa... sull'emulatore api16 funziona perfettamente, ma se provo su un api10 mi da l'errore in calce...
ho messo la support v4 revision 13 (May 2013)
e impostato il min sdk version = 10

come faccio a farlo funzionare con l'api 10 ?
grazie mille!

matteo


06-10 13:50:37.615: E/AndroidRuntime(373): FATAL EXCEPTION: main
06-10 13:50:37.615: E/AndroidRuntime(373): java.lang.NoSuchMethodError: it.gmariotti.android.example.navigationdrawer.MainActivity.getActionBar
06-10 13:50:37.615: E/AndroidRuntime(373):    at it.gmariotti.android.example.navigationdrawer.MainActivity.onCreate(MainActivity.java:45)
06-10 13:50:37.615: E/AndroidRuntime(373):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
06-10 13:50:37.615: E/AndroidRuntime(373):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
06-10 13:50:37.615: E/AndroidRuntime(373):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
06-10 13:50:37.615: E/AndroidRuntime(373):    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
06-10 13:50:37.615: E/AndroidRuntime(373):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
06-10 13:50:37.615: E/AndroidRuntime(373):    at android.os.Handler.dispatchMessage(Handler.java:99)
06-10 13:50:37.615: E/AndroidRuntime(373):    at android.os.Looper.loop(Looper.java:130)
06-10 13:50:37.615: E/AndroidRuntime(373):    at android.app.ActivityThread.main(ActivityThread.java:3683)
06-10 13:50:37.615: E/AndroidRuntime(373):    at java.lang.reflect.Method.invokeNative(Native Method)
06-10 13:50:37.615: E/AndroidRuntime(373):    at java.lang.reflect.Method.invoke(Method.java:507)
06-10 13:50:37.615: E/AndroidRuntime(373):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
06-10 13:50:37.615: E/AndroidRuntime(373):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
06-10 13:50:37.615: E/AndroidRuntime(373):    at dalvik.system.NativeStart.main(Native Method)

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:[facile] come utilizzare il nuovo Navigation Drawer
« Risposta #14 il: 10 Giugno 2013, 16:37:21 CEST »
0
ciao e grazie per il tutorial!
ti chiedo una cosa... sull'emulatore api16 funziona perfettamente, ma se provo su un api10 mi da l'errore in calce...
ho messo la support v4 revision 13 (May 2013)
e impostato il min sdk version = 10

come faccio a farlo funzionare con l'api 10 ?
grazie mille!

matteo


06-10 13:50:37.615: E/AndroidRuntime(373): FATAL EXCEPTION: main
06-10 13:50:37.615: E/AndroidRuntime(373): java.lang.NoSuchMethodError: it.gmariotti.android.example.navigationdrawer.MainActivity.getActionBar

Su questo hai ragione dovevo essere più preciso, ed ora correggo.
Il Navigation Drawer in se può funzionare su un dispositivo 2.3. Tuttavia questo esempio contiene l'Action Bar che è un API level 11+.
Se si vuole l'ActionBar con la 2.3 si deve utilizzare la SherlockAction Bar. Come detto nell'articolo l'ultima release ufficiale non supporta il Navigation Drawer, ma si può usare la fork sempre linkata in fondo all'articolo.