Як зробити додаток для Android з custom-ним ActionBar, NerdGrl

ActionBar — це елемент керування, за допомогою якого можна переміщатися між екранами програми, здійснювати пошук та багато іншого.
Стандартна ActionBar може виглядати так:
1 — іконка програми 2 — навігація по додатку (тут може бути список, що випадає, tabs, і т.п.) 3,4 — різні опції, у кожного додатка свої
Нерідко дизайнери хочуть бачити у програмі ActionBar, яку не можна реалізувати за допомогою стандартних налаштувань. І розробники Android SDK дали нам можливість встановити свій layout.
У найпростішому випадку нам потрібно задати файл розмітки /res/layout:
І в коді класу Activity у функції onCreate() вказати, що ми хочемо використовувати нестандартний ActionBar:
У результаті додаток виглядатиме приблизно так:

Але при запуску стандартний ActionBar все одно з'являтиметься перед завантаженням нашої розмітки, що, звичайно, некрасиво:

Щоб цього уникнути, потрібно перед запуском програми вимкнути ActionBar, а потім під час створення нашої activity увімкнути і відразу показати нашу розмітку. Для цього необхідно у файлі styles.xml додати такі властивості:
У результаті styles.xml має виглядати так:
Коли ми приховуємо ActionBar за допомогою властивості «android:windowActionBar»=false, на його місці малюється стандартний заголовок програми, який нам теж ні до чого. Його можна було б приховати, задавши «android:windowNoTitle»=true, але річ у тому, що ActionBar залежить від Title, і заголовок має бути завжди. Саме тому ми вдається до невеликої хитрості і лише змінюємо висоту заголовка на 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. Ми можемо самостійно змінити цю змінну, додавши наступний метод у код нашої Activity: