2013-07-25 13 views
9

ho iniziato a lavorare con NavigationDrawer usando ActionBarSherlock e ottenuto buoni risultati, ma la mia azienda l'approvazione di questo Open Source, non è probabile che venga in qualunque momento presto, così io sto lavorando per passare alla ActionBarCompat.Android: NavigationDrawer e ActionBarCompat

ActionBarCompat è stato ufficialmente rilasciato ieri (24 luglio 2013). Qualcuno ha avuto modo di lavorare bene l'uno con l'altro? Spero di poter rispondere alla mia stessa domanda, ma vedendo se qualcuno ha ottenuto che funzioni. La gara è iniziata! :-)

YouTube sul rilascio di ActionBarCompat: https://www.youtube.com/watch?v=6TGgYqfJnyc


UPDATE (codice di lavoro, sì!): ho ottenuto l'applicazione di esempio NavigationDrawer da Google convertito per utilizzare ActionBarCompat e sta funzionando bene. Lo si può trovare qui come riferimento o iniziare al progetto: https://github.com/bcrider/NavigationDrawerActionBarCompat

La versione 2.x sembra anche meglio di come ha fatto con ActionBarSherlock, ma dovrò lavorare con ActionBarCompat molto di più da vedere se mi piace di più


+0

Sono ansioso di conoscere la tua esperienza con ActionBar compat e cassetto Nav, anch'io ho usato il cassetto Nav e ABS e funziona bene. –

+0

Funziona bene, ad eccezione delle voci di menu. Controlla questa risposta per la sintassi corretta http://stackoverflow.com/questions/17913311/is-it-possible-to-have-a-action-bar-menu-using-the-appcompat-library – Zeezer

+0

Appcompat Drawer Nav è molto lento anche sul mio Motorola M860, ho provato alcuni lib Drawer personalizzati e le loro prestazioni sono di gran lunga migliori – Singgum3b

risposta

13

NOTA: Sono troppo nuovo per aggiungere più di un collegamento in un post, ecc., Quindi sto rispondendo alla mia domanda anziché modificarla (spero che non sia contro le regole?). Modifica l'originale una volta consentito.

modo semplice per aggiungere navigazione Cassetto con ActionBarCompat: ho trovato che la conversione mia app esistente non era così male come ho pensato che sarebbe stato. Il campione di Google mi ha portato a credere che i frammenti fossero una necessità, ma non era così ... tutt'altro.

È possibile semplicemente avvolgere i layout esistenti con DrawerLayout e collegare il controllo ListView (o qualsiasi altro layout contenente il ListView) per la navigazione effettiva. Quindi aggiungi il codice normale alla tua attività esistente (estendi ActionBarActivity) e costruisci la navigazione come avresti comunque.

Ecco alcuni esempi di codice con cui avvolgere il layout esistente:

<?xml version="1.0" encoding="utf-8"?> 

<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" > 

[YOUR EXISTING LAYOUT GOES HERE] 

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

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

Se si vuole iniziare con un'applicazione di esempio che fa uso di frammenti e passare da lì, ecco il mio repository github sulla base del codice di esempio : https://github.com/bcrider/NavigationDrawerActionBarCompat

0

I campioni che vengono con il 4.3 sdk sembrano promettenti, ma ho intenzione di creare un progetto di test e provare a convertire il mio propria applicazione per ActionBarCompact e vedere se funziona meglio o peggio di ActionBarSherlock! Aggiornerò questo post se ho successo o no!

+2

Finalmente in grado di tornare a questo e ho trovato un passaggio mancante al processo di integrazione. Il video non menzionava chiaramente (o abbastanza chiaramente per me) l'importazione del progetto come libreria. Una volta fatto questo, molti problemi sono andati via. Ho semplicemente importato. \ Sdk \ extras \ android \ support \ v7 \ appcompat nel mio spazio di lavoro e poi l'ho aggiunto al mio progetto principale come libreria. Basta copiare i file jar come il video sembrava suggerire non era abbastanza. –

2

Ho convertito la mia app da ActionBarSherlock a ActionBarCompat ieri. Ho avuto alcuni problemi, ma niente di troppo serio.

ho alcune osservazioni:

Per aggiornare i temi, ho solo bisogno di ignorare "Sherlock" a "AppCompat". Ad esempio, invece di ereditare da @ style/Theme.Sherlock.Light.DarkActionBar, sto ereditando da @ style/Theme.AppCompat.Light.DarkActionBar.

Per gli elementi di azione, basta aggiornare in questo modo:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:yourapp="http://schemas.android.com/apk/res-auto" > 
    <item android:id="@+id/action_search" 
      android:icon="@drawable/ic_action_search" 
      android:title="@string/action_search" 
      yourapp:showAsAction="ifRoom" /> 
    ... 
</menu> 

E nel onCreateOptionsMenu, utilizzare il normale MenuItem, ma l'uso di metodi statici MenuItemCompat per fare cose di ActionBar. Ad esempio: MenuItemCompat.expandActionView (searchMenuItem);

Se si utilizza RoboGuice ereditato da RoboSherlockActivity, si avranno problemi se si copia e si passa ad ActionBarActivity. Ecco la mia soluzione:

public class RoboActionBarActivity extends ActionBarActivity implements RoboContext { 

    protected EventManager eventManager; 
    protected HashMap<Key<?>, Object> scopedObjects = new HashMap<Key<?>, Object>(); 

    @Inject 
    ContentViewListener ignored; // BUG find a better place to put this 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     final RoboInjector injector = RoboGuice.getInjector(this); 
     eventManager = injector.getInstance(EventManager.class); 
     injector.injectMembersWithoutViews(this); 
     super.onCreate(savedInstanceState); 
     eventManager.fire(new OnCreateEvent(savedInstanceState)); 
    } 

    @Override 
    public void setContentView(int layoutResID) { 
     super.setContentView(layoutResID); 
     contentViewChanged(); 
    } 

    @Override 
    public void setContentView(View view) { 
     super.setContentView(view); 
     contentViewChanged(); 
    } 

    @Override 
    public void setContentView(View view, ViewGroup.LayoutParams params) { 
     super.setContentView(view, params); 
     contentViewChanged(); 
    } 

    @Override 
    public void addContentView(View view, ViewGroup.LayoutParams params) { 
     super.addContentView(view, params); 
     contentViewChanged(); 
    } 

    private void contentViewChanged() { 
     RoboGuice.getInjector(this).injectViewMembers(this); 
     eventManager.fire(new OnContentChangedEvent()); 
    } 

    @Override 
    protected void onRestart() { 
     super.onRestart(); 
     eventManager.fire(new OnRestartEvent()); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     eventManager.fire(new OnStartEvent()); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     eventManager.fire(new OnResumeEvent()); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     eventManager.fire(new OnPauseEvent()); 
    } 

    @Override 
    protected void onNewIntent(Intent intent) { 
     super.onNewIntent(intent); 
     eventManager.fire(new OnNewIntentEvent()); 
    } 

    @Override 
    protected void onStop() { 
     try { 
      eventManager.fire(new OnStopEvent()); 
     } finally { 
      super.onStop(); 
     } 
    } 

    @Override 
    protected void onDestroy() { 
     try { 
      eventManager.fire(new OnDestroyEvent()); 
     } finally { 
      try { 
       RoboGuice.destroyInjector(this); 
      } finally { 
       super.onDestroy(); 
      } 
     } 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     final Configuration currentConfig = getResources().getConfiguration(); 
     super.onConfigurationChanged(newConfig); 
     eventManager.fire(new OnConfigurationChangedEvent(currentConfig, newConfig)); 
    } 

    @Override 
    public void onContentChanged() { 
     super.onContentChanged(); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     eventManager.fire(new OnActivityResultEvent(requestCode, resultCode, data)); 
    } 

    @Override 
    public Map<Key<?>, Object> getScopedObjectMap() { 
     return scopedObjects; 
    } 

} 

Ora, si inizia con ActionMode supportStartActionMode() e le importazioni del ActionMode dal pacchetto della biblioteca.

Per utilizzare il SearchView, è necessario fare qualcosa di simile:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto"> 

    <item 
     android:id="@+id/search" 
     app:actionViewClass="android.support.v7.widget.SearchView" 
     android:icon="@drawable/abc_ic_search" 
     app:showAsAction="always|collapseActionView" 
     android:title="@string/search"/> 

</menu> 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.search_menu, menu); 

    searchMenuItem = menu.findItem(R.id.search); 
    searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem); 

    if (searchView != null) { 
     searchView.setIconifiedByDefault(false); 

     SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() { 
      public boolean onQueryTextChange(String newText) { 
       return true; 
      } 

      public boolean onQueryTextSubmit(String query) { 
       doSomething(query); 
       return true; 
      } 
     }; 

     searchView.setOnQueryTextListener(queryTextListener); 

    } 

    return super.onCreateOptionsMenu(menu); 
} 

Le altre cose stanno lavorando senza alcuna modifica, ma il pacchetto delle importazioni.

È possibile visualizzare ulteriori informazioni qui: http://developer.android.com/guide/topics/ui/actionbar.html.

+0

Molto bello! Sono contento che tu abbia menzionato il pezzo della ricerca, visto che inizierò a usarlo nella prossima settimana o dopo che (spero) convertiremo da ABS in ABC. –

+0

Bene, sto riscontrando un problema con SearchView. Guarda qui: http://stackoverflow.com/questions/17898282/searchview-taking-all-the-space-in-the-new-actionbarcompat –

+0

Un altro roadblock: ActionBarCompat e utilizzalo su MapActivity. Qualche possibilità hai già passato quel posto di blocco? Ho postato una domanda qui: http://stackoverflow.com/questions/17980503/actionbarcompat-and-mapactivity –

0

Mentre l'esempio fornito è buono, ho fatto un altro esempio che è un po 'più vicino all'esempio originale di Google Navigation Drawer in quanto include tutto il codice originale (che ora mira a supportare la libreria) e la formattazione. Solo alcuni attributi dovevano essere sostituiti con altri simili in quanto sono disponibili solo dalla v11 in poi.

download all'indirizzo: https://github.com/GunnarBs/NavigationDrawerWithActionBarCompat

Nota: Questo richiede la v7 appcompat biblioteca di essere presente, vedi http://developer.android.com/tools/support-library/setup.html per i dettagli.

Problemi correlati