5

Mam dziwny problem z ustaleniem wysokości ActionBar. Mam kilka części w mojej aplikacji, gdzie coś znajduje się tuż pod ActionBar, a także używam biblioteki Chrisa Banesa actionbar-pulltorefresh.Problem z Androidem ActionBar wysokościowym

Będę używał przykładu z przeciągnięcia, aby odświeżyć bibliotekę. Występuje dokładnie to samo, co problem here, z tym że robię wszystko dokładnie tak, jak mówi przewodnik za pomocą Fragments. Zasadniczo oblicza wysokość ActionBar na około połowę tego, co powinno być. Również w innej części aplikacji pozycjonuję PopupWindow pod ActionBar, więc nazywam się getHeight() i używam tej pozycji w moim oknie, mam taki sam problem jak w przypadku biblioteki odciągania do odświeżenia.

To sprawia, że ​​myślę, że ma to coś wspólnego z mierzeniem wysokości i może to być problem ze stylem.

Ale tutaj jest, gdzie robi się interesująco. Jeśli obrócę urządzenia do trybu poziomego, obliczam wysokość w porządku i umieszczam wszystko, co powinno być od tego momentu, nawet jeśli obrócę z powrotem do portretu. to jest nagle naprawione, dopóki nie uruchomię ponownie aplikacji i nie zabiorę jej z pamięci i nie zacznę od nowa.

Czy ktoś miał coś podobnego?

UWAGA: Używam teraz biblioteki appcompat, ale używałem ActionBarSherlock wcześniej, a także podstawowego ActionBara w pewnym momencie, a wszystkie scenariusze dały taki sam wynik.

UPDATE 1: uzyskać takie same wyniki z zagadnień here, here i here. Jednak robię wszystko, co README mówi, aby to zrobić, ale jestem pewien, że ma to coś wspólnego z tym, jak moje urządzenie mierzy wysokość ActionBar.

UPDATE 2: użyłem actionbar PullToRefresh bibliotekę w innej działalności i działa dobrze, więc to musi być coś z moim głównym Activity.

+0

Pytanie brzmi, gdy wywołasz metodę 'getHeight()'? Jak Pociągnij, aby odświeżyć bibliotekę, wywołuje ją w określonym czasie. tj. gdy tworzone jest 'Widok'. na bocznej notatce używasz 'widoku pager'? –

+0

Używam 'ViewPager' w niektórych' Fragmentach', ale problem istnieje wszędzie w obrębie rodzica 'Activity'. – Wenger

+0

Nazywam 'getHeight()' jako jedną z pierwszych rzeczy w moim 'Activity'' onCreate() '. – Wenger

Odpowiedz

4

Nazywam getHeight() jako jedną z pierwszych rzeczy w mojej działalności onCreate().

To właśnie zwraca niewłaściwą wysokość, najprawdopodobniej 0. ActionBar nie jest jeszcze gotowy, aby podać szczegółowe informacje na swój temat w tym momencie. Jest w trakcie tworzenia, wraz z resztą widoku aktywności.

Spróbuj wykonać następujące czynności:

@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); 
} 

To powinno dać prawidłową wartość wysokości ActionBar użytkownika.

Jako dowód koncepcji, wypowiedz komentarz mContentView.post(...); i po prostu pokaż toast. Toast najprawdopodobniej powie: ActionBar's height is 0.

+0

Dzięki, zrobię to dziś wieczorem. Nawet jeśli nie nazywam 'getHeight()' w moim kodzie w dowolnym miejscu, biblioteka PullToRefresh nadal daje mi wyniki z linków. – Wenger

14

Aby upewnić się, że nie ma widoków pod Twoim paskiem akcji, możesz dodać do niego górny margines w pliku XML.

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

Źródło: http://developer.android.com/guide/topics/ui/actionbar.html#Style

UPDATE: Następujący tekst zostaje dodany na. Postanowiłem zagłębić się w kod źródłowy Androida, aby zobaczyć, jakie są rzeczywiste wysokości ActionBaru. Rozglądałem się więc we wszystkich różnych typach wartości/dimens.xml, aby znaleźć action_bar_default_height. Poniżej znajdują się ustalenia.

W values/dimens.xml,

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

W values-land/dimens.xml,

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

W values-sw600dp/dimens.xml,

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

Ja również sprawdzone następujące, ale nie zastępować tego atrybutu:

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

Kiedy dostanę więcej czasu, mogę poszukać źródła problemu, ale do tego czasu możesz dodać te trzy wartości do różnych folderów wartości (jako poprawki tymczasowe).

+0

Wydaje się, że problemem jest actionBarSize zwraca nieprawidłową wartość. To około połowa tego, co powinno być. – Wenger

+0

OK. Oto pierwsza odpowiedź, którą zamierzałem odłożyć (ale nie mogłem znaleźć źródła): Pamiętam, że gdzieś w dokumentach systemu Android było napisane, że ActionBar ma 50dp wysokości w pionie i 44dp wysokości w krajobrazie (urządzenie smartphone). Ale wkrótce zaktualizuję swoją odpowiedź. – Anonsage

+0

Dzięki. To powinno działać jako pomoc dla zespołu, i jeśli to najlepsze, co mogę zrobić, to myślę, że to zadziała. – Wenger