Как да създадете приложение за Android с персонализиран ActionBar, NerdGrl

android

ActionBar е контрола, която ви позволява да се движите между екрани на приложения, да търсите и др.

Стандартен ActionBar може да изглежда така:

1 - икона на приложение 2 - навигация през приложението (може да има падащ списък, раздели и т.н.) 3,4 - различни опции, всяко приложение има своя собствена

Често дизайнерите искат да видят ActionBar в приложение, което не може да бъде реализирано чрез стандартни настройки. И разработчиците на Android SDK ни дадоха възможност да зададем собствено оформление.

В най-простия случай трябва да настроим файла с оформлението в /res/layout:

И в кода на класа Activity във функцията onCreate() посочете, че искаме да използваме нестандартен ActionBar:

В резултат на това приложението ще изглежда така:

android

Но при стартиране стандартният ActionBar ще се появи, преди да зареди нашата маркировка, което, разбира се, е грозно:

създадете

За да избегнете това, трябва да деактивирате ActionBar, преди да стартирате приложението, и след това, когато създавате нашата дейност, да активирате и незабавно да покажете нашата маркировка. За да направите това, добавете следните свойства към файла styles.xml:

В резултат styles.xml трябва да изглежда така:

Когато скрием ActionBar със свойството "android:windowActionBar"=false, на негово място се рисува стандартното заглавие на приложението, което също не ни е необходимо. Може да се скрие чрез настройка на "android:windowNoTitle"=true, но факт е, че ActionBar зависи от заглавието и заглавието винаги трябва да присъства. Ето защо прибягваме до малък трик и просто променяме височината на заглавката на 0dp.

След това във функцията onCreate(), преди да работите с ActionBar, добавете следния ред:

Сега стандартният ActionBar не се вижда,и нашата маркировка се зарежда веднага.

Това можеше да приключи, но този код ще работи само с API по-високи от 11. За да поддържате API 7 и по-горе, трябва да използвате ActionBarActivity, която работи с SupportActionBar. Ако оставите кода, който току-що написахме, като замените само Activity с ActionBarActivity и използвате getSupportActionBar (), тогава на теория всичко трябва да работи, но - ако всичко беше толкова просто! Въпросът е, че в този случай методът getSupportActionBar() ще върне null и ще бъде невъзможно да работите с ActionBar. Нека разгледаме по-отблизо тази ситуация:

Ако погледнете в източниците на библиотеката android.support.v7, можете да видите, че когато се извика методът getSupportActionBar(), се проверява променливата mHasActionBar:

Променливата mHasActionBar може да бъде променена чрез извикване на supportRequestWindowFeature(int featureId). Но за Android API над 11 тази функция се дефинира като:

И следователно не променя променливата mHasActionBar по никакъв начин, следователно методът getSupportActionBar() винаги връща null. Можем сами да променим тази променлива, като добавим следния метод към нашия код на дейност: