23

Recentemente ho sviluppato un'app per Android, in cui ho bisogno di avere un layout e una dimensione personalizzati per la barra delle schede. Il modo in cui l'ho fatto finora è utilizzando la libreria ActionBarSherlock di Jake Wharton per supportare versioni precedenti di HoneyComb Android e applicando uno stile all'app in cui modifico l'elemento di stile actionBarSize.Altezza della barra delle azioni di modifica su Android JellyBean

Ora, ho testato l'app sul Galaxy S3 (con Jellybean su di esso) e l'altezza della barra delle schede non cambia più in base al valore actionBarSize.

Così ho iniziato a guardare attraverso il codice di Jellybean, e ho trovato questo metodo nella classe ActionBarPolicy:

public int getTabContainerHeight() { 
      TypedArray a = mContext.obtainStyledAttributes(null, R.styleable.ActionBar, 
       com.android.internal.R.attr.actionBarStyle, 0); 
      int height = a.getLayoutDimension(R.styleable.ActionBar_height, 0); 
      Resources r = mContext.getResources(); 
      if (!hasEmbeddedTabs()) { 
       // Stacked tabs; limit the height 
       height = Math.min(height, 
         r.getDimensionPixelSize(R.dimen.action_bar_stacked_max_height)); 
      } 
      a.recycle(); 
      return height; 
    } 

Da quanto ho capito in questo metodo, sembra che Jellybean limita l'altezza del TabBar, quando l'app è in modalità verticale, impostando l'altezza della barra delle schede sul valore della dimensione "action_bar_stacked_max_height" (che è 48dp, nel file /values/dimen.xml della 4.1), anche se ho impostato l'altezza della barra delle azioni in actionBarSize.

Ho provato a sovrascrivere questo valore di dimensione, impostandolo sul mio valore nel mio file dimen.xml, ma non ho avuto fortuna. Non ha funzionato.

La mia domanda:

Sei ragazzi sanno di un modo in cui posso ignorare il "action_bar_stacked_max_height" Valore dimen?

Grazie in anticipo!

+0

Ho anche lo stesso problema. C'è qualche soluzione che hai trovato per questo? – user936414

risposta

1

mi sembra che sia stato fatto di proposito e non so perché. Ci sono alcune variabili in bools.xml

<bool name="action_bar_embed_tabs">true</bool> 
<bool name="action_bar_embed_tabs_pre_jb">false</bool> 

L'altezza delle schede incorporare è limitata a 48dip in ActionBarPolicy.java, come si è già accennato. Ecco perché questo comportamento può essere visto solo in Android JellyBean o superiore. Non riesco a trovare una soluzione migliore rispetto a fare qualche riflessione java. Così qui è il codice

private void hackJBPolicy() { 
    View container = findScrollingTabContainer(); 
    if (container == null) return; 

    try { 
     int height = getResources().getDimensionPixelSize(R.dimen.action_bar_height); 
     Method method = container.getClass() 
       .getDeclaredMethod("setContentHeight", Integer.TYPE); 
     method.invoke(container, height); 
    } catch (NoSuchMethodException e) { 
     Log.e(LOG_TAG, e.getLocalizedMessage(), e); 
    } catch (IllegalArgumentException e) { 
     Log.e(LOG_TAG, e.getLocalizedMessage(), e); 
    } catch (IllegalAccessException e) { 
     Log.e(LOG_TAG, e.getLocalizedMessage(), e); 
    } catch (InvocationTargetException e) { 
     Log.e(LOG_TAG, e.getLocalizedMessage(), e); 
    } 
} 

private View findScrollingTabContainer() { 
    View decor = getWindow().getDecorView(); 
    int containerId = getResources().getIdentifier("action_bar_container", "id", "android"); 

    // check if appcompat library is used 
    if (containerId == 0) { 
     containerId = R.id.action_bar_container; 
    } 

    FrameLayout container = (FrameLayout) decor.findViewById(containerId); 

    for (int i = 0; i < container.getChildCount(); i++) { 
     View scrolling = container.getChildAt(container.getChildCount() - 1); 
     String simpleName = scrolling.getClass().getSimpleName(); 
     if (simpleName.equals("ScrollingTabContainerView")) return scrolling; 
    } 

    return null; 
} 

Utilizzare il metodo hackJBPolicy() nel vostro onCreate. Notare che ho usato ActionBar dalla libreria appcompat. Ecco il link per il progetto di esempio con l'uso di questa soluzione alternativa.

Dopo tutto, mi sembra che in futuro sarebbe più facile creare una vista personalizzata allineata alla parte superiore dello schermo invece di utilizzare ActionBar in modalità schede se il tuo design dell'interfaccia utente è un po 'lontano dalle linee guida.

+0

Puoi spiegare come implementarlo utilizzando la barra delle azioni standard, non dal supporto biblioteca? Non riesco a trovare la risorsa denominata R.id.action_bar_container. – user2302510

+0

So che questo è un commento molto tardo, ma accetterò la risposta di st_, anche se usa la reflection (che teoricamente rallenta un po 'l'app). Ma fornisce sufficienti informazioni affinché qualcuno possa scavalcare la "politica JB". Alla fine, ho sviluppato la mia barra personalizzata, come ho detto st_. – edy

26

Prova a mettere android:actionBarSize e actionBarSize nell'ambito del tema che si sta utilizzando, in questo modo:

<style name="Theme.white_style" parent="@android:style/Theme.Holo.Light.DarkActionBar"> 
     <item name="android:actionBarSize">55dp</item> 
     <item name="actionBarSize">55dp</item> 
</style> 
+6

Questo non funziona su JellyBean. – Tomik

+1

Funziona su Jellybean. L'ho confermato sul mio Nexus 4 – Anton

+4

Bene, cambia l'altezza della barra delle azioni principale ma non influenza l'altezza della barra delle schede (sicuramente non su Android 4.2.2). – Tomik

9

Provare a utilizzare android:height come la seguente:

<style name="AppActionBar"> 
    <item name="android:height">50dp</item> 
</style> 

<style name="MainActivityStyle" parent="@android:style/Theme.Holo"> 
    <item name="android:actionBarStyle">@style/AppActionBar</item> 
</style> 
+1

funziona per la barra di azione divisa ma non per la seconda riga/barra impilata (schede) – jfcartier

Problemi correlati