5

Sto avendo uno strano problema con la determinazione dell'altezza dello ActionBar. Ho un paio di parti nella mia app in cui qualcosa è posizionato proprio sotto il ActionBar, e sto anche usando la libreria di Chris Banes actionbar-pulltorefresh.Problema di altezza ActionBar Android

Userò l'esempio dalla libreria pull per aggiornare. Sto vivendo la stessa identica cosa del problema here, ad eccezione del fatto che sto facendo tutto esattamente come dice la guida con Fragments. In pratica calcola l'altezza dello ActionBar come circa la metà di ciò che dovrebbe essere. Anche in una parte diversa dell'app, sto posizionando uno PopupWindow sotto lo ActionBar, quindi chiamo lo getHeight() e uso quella posizione per la mia finestra, ottengo lo stesso problema con il pull per aggiornare la libreria.

Quindi questo mi fa pensare che si tratti di come misurare l'altezza dello ActionBar e potrebbe essere un problema di stile.

Ma ecco dove diventa interessante. Se si ruotano i dispositivi in ​​modalità orizzontale, si calcola l'altezza e si mette tutto dove dovrebbe essere da quel punto in poi, anche se si ruota di nuovo in verticale. viene improvvisamente corretto fino a quando non riavvio l'app e lo uccido dalla memoria e ricomincio da capo.

Qualcuno ha avuto qualcosa di simile?

NOTA: sto usando la libreria appcompat ora, ma stavo usando ActionBarSherlock prima, così come il Basic ActionBar ad un certo punto, e tutti gli scenari davano lo stesso risultato.

UPDATE 1: ottengo gli stessi risultati delle questioni here, here e here. Comunque sto facendo tutto quello che il README dice di fare quindi sono abbastanza fiducioso che si tratti di come il mio dispositivo misura l'altezza dello ActionBar.

UPDATE 2: ho usato l'ActionBar biblioteca PullToRefresh in un'altra attività e funziona benissimo, quindi deve essere qualcosa a che fare con il mio principale Activity.

+0

La domanda è quando chiami 'getHeight()'? Come pull per aggiornare la libreria, lo chiama, in un momento particolare. cioè quando viene creato 'View'. a lato nota che stai usando 'view pageer '? –

+0

Sto usando un 'ViewPager' in alcuni' Fragments', ma il problema esiste ovunque all'interno del 'Activity' padre. – Wenger

+0

Io chiamo 'getHeight()' come una delle prime cose nel mio 'Activity'' onCreate() '. – Wenger

risposta

4

Io chiamo getHeight() come una delle prime cose nella mia attività onCreate().

Questo è ciò che restituisce l'altezza sbagliata, molto probabilmente 0. ActionBar non è pronto a fornire dettagli su se stesso a questo punto. È in fase di creazione, insieme al resto della vista dell'attività.

provare quanto segue:

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

    // Don't call setContentView(int) 

    // Inflate the layout file that 
    // you would have used with setContentView(R.layout.xml_file) 
    View mContentView = getLayoutInflater().inflate(R.layout.xml_file, null); 

    // Add this Runnbale to mContentView's message queue 
    mContentView.post(new Runnable() { 

     @Override 
     public void run() { 
      Toast.makeText(Your_Activity.this, "ActionBar's height is " + 
         getActionBar().getHeight(), Toast.LENGTH_LONG).show(); 
     } 

    }); 

    // Initialize widgets contained in R.layout.xml_file 

    // Example 
    Button b = (Button) mContentView.findViewById(R.id.button_id); 

    ....   

    setContentview(mContentView); 
} 

Questo dovrebbe dare il valore corretto per l'altezza di ActionBar.

Come prova del concetto, commentare mContentView.post(...); e mostrare semplicemente Toast. Molto probabilmente il Toast dirà ActionBar's height is 0.

+0

Grazie, ci provo stasera. Anche se nel mio codice non chiamo 'getHeight()' nel mio codice, la libreria PullToRefresh mi da ancora i risultati dei collegamenti. – Wenger

14

Per assicurarsi che non ci siano Visualizzazioni nella barra delle azioni, è possibile aggiungere un margine superiore ad esso nell'XML.

<SomeView 
    ... 
    android:layout_marginTop="?android:attr/actionBarSize" /> 

Fonte: http://developer.android.com/guide/topics/ui/actionbar.html#Style

UPDATE: viene aggiunto quanto segue. Ho deciso di immergermi nel codice sorgente di Android per vedere quali sarebbero le dimensioni effettive di ActionBar. Quindi, ho cercato tutti i diversi tipi di valori/dimens.xml per trovare action_bar_default_height. Di seguito sono i risultati.

In values/dimens.xml,

<!-- Default height of an action bar. --> 
<dimen name="action_bar_default_height">48dip</dimen> 

In values-land/dimens.xml,

<!-- Default height of an action bar. --> 
<dimen name="action_bar_default_height">40dip</dimen> 

In values-sw600dp/dimens.xml,

<!-- Default height of an action bar. --> 
<dimen name="action_bar_default_height">56dip</dimen> 

Inoltre ho controllato quanto segue, ma non sovrascrivono questo attributo:

values-large 
values-sw380dp 
values-sw600dp-land 
values-sw720dp 
values-w360dp 
values-w600dp 
values-w720dp 
values-xlarge 

Quando ho più tempo, posso cercare la radice del problema, ma fino ad allora è possibile aggiungere questi tre valori nelle diverse cartelle dei valori (come correzione temporanea).

+0

Sembra che il problema sia actionBarSize restituisce il valore sbagliato. È circa la metà di ciò che dovrebbe essere. – Wenger

+0

Ok. Ora ecco la prima risposta che stavo per mettere giù (ma non riuscivo a trovare la fonte): ricordo da qualche parte nei documenti di Android che ha detto che ActionBar è alto 50dp in verticale e 44dp in orizzontale (dispositivo smartphone). Ma aggiornerò la mia risposta a breve. – Anonsage

+0

Grazie. Questo dovrebbe funzionare come un cerotto, e se è il meglio che posso fare, suppongo che dovrà funzionare. – Wenger

Problemi correlati