2012-03-11 12 views
35

Sto utilizzando una vista personalizzata per ActionBar con schede. Il mio problema è l'ordine della visualizzazione personalizzata. Android lo sta visualizzando DOPO le schede - che non voglio.Come personalizzare Android ActionBar per mostrare una vista personalizzata prima delle schede?

Desidero visualizzare la vista personalizzata PRIMA di le schede.

C'è un modo per personalizzare l'azioneBar per mostrare la vista personalizzata prima delle schede? o non è possibile?

Codice:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    final ActionBar bar = getActionBar(); 
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    View customActionBarView = 
     getLayoutInflater().inflate(R.layout.home_actionbar, null, true); 
    ActionBar.LayoutParams lp = 
     new ActionBar.LayoutParams(LayoutParams.WRAP_CONTENT, 
      LayoutParams.WRAP_CONTENT); 

    lp.gravity = Gravity.START; 
    bar.setCustomView(customActionBarView, lp); 
    bar.setLogo(R.drawable.logo); 
    bar.setHomeButtonEnabled(true); 
    bar.setDisplayShowCustomEnabled(true); 

    bar.addTab(bar.newTab() 
     .setText("Stuff") 
     .setTabListener(new TabListener<StuffFragment>(
      this, "stuff", StuffFragment.class))); 

    bar.addTab(bar.newTab() 
     .setText("Friends") 
     .setTabListener(new TabListener<ContactsFragment>(
      this, "friends", ContactsFragment.class))); 

    bar.addTab(bar.newTab() 
     .setText("Messages") 
     .setTabListener(new TabListener<ConversationsFragment>(
      this, "messages", ConversationsFragment.class))); 

    if (savedInstanceState != null) { 
     bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0)); 
    } 

    bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | 
     ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_USE_LOGO); 

    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);  
} 

enter image description here

+0

avremo bisogno di vedere qualche codice. Inoltre, dovresti cercare di essere più chiaro su cosa intendi con 'prima' e' dopo'. Capitalizzare loro non rende le cose più cristalline. – adneal

+0

aggiornato con il codice e lo schema –

+2

ive cercato ovunque. sembra che non ci sia alcun controllo su come ogni elemento (logo, schede, vista personalizzata e menu) sulla barra delle azioni è posizionato. FML! –

risposta

0

Quando si aggiunge la visualizzazione personalizzata per l'ActionBar è possibile specificare anche la gravità.

ActionBar.LayoutParams lp = new ActionBar.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);    
lp.gravity = Gravity.LEFT; 
customView.setLayoutParams(lp); 
+0

i ' Ho provato molte soluzioni diverse tra cui quelle sopra senza successo. invece ho deciso di abbandonare la barra delle azioni e implementare qualcosa di completamente personalizzato. –

+0

Quindi, perché downvotare se non riesci a farlo funzionare? La mia risposta era corretta, – Lee

0

uso ActionBarSherlock, che è molto buona implementazione di ordinazione ActionBar per tutte le versioni di Android e molto facile da usare.

oppure è possibile creare il proprio ActionBar utilizzando la barra del titolo personalizzata ed è abbastanza semplice da implementare. Puoi vedere gli esempi this e this sono esempi molto buoni di barre del titolo personalizzate.

3

Questo sembra essere il comportamento previsto quando si utilizzano schede e viste personalizzate. https://code.google.com/p/android/issues/detail?id=36191#c3

Se date un'occhiata allo ActionBarSherlock - Tabs appearing ABOVE actionbar with custom view molte altre persone lo stanno vivendo e alcune persone hanno offerto soluzioni.

Non sono riuscito a far funzionare nessuna delle soluzioni, ma potrebbero funzionare per voi. Il trucco sembra essere quello di assicurarsi che il logo non sia impostato per essere nascosto. Chiama
getActionBar().setDisplayShowHomeEnabled(true) o getSupportActionBar().setDisplayShowHomeEnabled(true) se si utilizza ActionBarSherlock.

quindi chiamare:

View homeIcon = findViewById(
    Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ? 
    android.R.id.home : R.id.abs__home); 
((View) homeIcon.getParent()).setVisibility(View.GONE); 
((View) homeIcon).setVisibility(View.GONE); 

questo otterrà un riferimento alla vista ActionBar che contiene il logo e lo imposta andato con abilita la visualizzazione personalizzata per riempire l'intera vista genitore, ma dovrebbe mantenere le schede al di sotto ...

Come ho detto non sono riuscito a farlo funzionare, ma alcune persone hanno avuto successo.

Buona fortuna.

+0

Questo è esattamente nello spirito di hacking della barra delle azioni. Ottimo suggerimento, ha funzionato! – foxx1337

2

Ho avuto lo stesso problema e ho trovato un modo per risolverlo. Non è una soluzione "elegante" ma è stata la migliore che ho trovato. Come prima cosa dal momento che si desidera modificare il comportamento ActionBar standard, è necessario forzare ActionBar Sherlok a utilizzare sempre l'implementazione non nativa. Per fare che ActionBarSherlok.java aperta e commentare questa riga di codice:

registerImplementation(ActionBarSherlockNative.class); 

quindi rimuovere tutti i valori-V14 valori-v11 etc ed essere sicuri di estendere sempre Theme.Sherlock e mai a tema.Holo

A questo punto si è sicuri che l'implementazione di ActionBar è sempre quella scritta da Jake Wharton. L'unica cosa che rimane da fare è rendere il layout della vista ActionBar nel modo desiderato. Aprire ActionBarView.java e nel onLayout() metodo di spostare questo pezzo di codice

if (mExpandedActionView == null) { 
     final boolean showTitle = mTitleLayout != null && mTitleLayout.getVisibility() != GONE && 
       (mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0; 
     if (showTitle) { 
      x += positionChild(mTitleLayout, x, y, contentHeight); 
     } 

     switch (mNavigationMode) { 
      case ActionBar.NAVIGATION_MODE_STANDARD: 
       break; 
      case ActionBar.NAVIGATION_MODE_LIST: 
       if (mListNavLayout != null) { 
        if (showTitle) x += mItemPadding; 
        x += positionChild(mListNavLayout, x, y, contentHeight) + mItemPadding; 
       } 
       break; 
      case ActionBar.NAVIGATION_MODE_TABS: 
       if (mTabScrollView != null) { 
        if (showTitle) x += mItemPadding; 
        x += positionChild(mTabScrollView, x, y, contentHeight) + mItemPadding; 
       } 
       break; 
     } 
    } 

a destra prima di questo pezzo

if (mProgressView != null) { 
     mProgressView.bringToFront(); 
     final int halfProgressHeight = mProgressView.getMeasuredHeight()/2; 
     mProgressView.layout(mProgressBarPadding, -halfProgressHeight, 
       mProgressBarPadding + mProgressView.getMeasuredWidth(), halfProgressHeight); 
    } 

Il gioco è fatto! Spero che questo aiuti

0

Stai facendo un'app per il tablet? Per quanto ne so, la barra delle schede della barra delle azioni appare fondamentalmente sotto la stessa sul cellulare.
Se su tablet, temo che non sia possibile regolare le posizioni delle schede. quello che posso pensare è che è necessario uscire utilizzando la modalità di navigazione e creare una vista personalizzata che assomiglia a schede per sostituire le schede ActionBar. Ovviamente questo comporta un grande sforzo in più per gestire il materiale di navigazione.

0

Basta creare una vista personalizzata per il pulsante Home. In questa vista puoi combinare sia il logo che la vista personalizzata che stai cercando di posizionare sulla sinistra. Quindi aggiungere schede come normale

L'unico aspetto negativo di questa soluzione è che avrete bisogno per mantenere lo stato del pulsante indietro da soli (se lo si utilizza a tutti)

0

primo set "DisplayShowHomeEnabled" proprietà di ActionBar a "true": actionBar.setDisplayShowHomeEnabled (true);

e poi:

View homeIcon = findViewById(android.R.id.home); 
     ((View) homeIcon.getParent()).setVisibility(View.GONE); 
     ((View) homeIcon).setVisibility(View.GONE); 

Spero che aiuta :)

Problemi correlati