Добавление панели действий в Theme.Black.NoTitleBar Android

Я пытаюсь добавить панель действий программно, как показано в документе dev, но я сталкиваюсь с ошибкой. Мой minSdk установлен в 11, мое приложение имеет один макет и одно действие, и единственный код в этом действии:

@Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.inbox); ActionBar actionBar = getActionBar(); actionBar.show(); } 

Если я возьму эти последние две строки, то мое приложение запустится. Я знаю, что головая тема включает панель действий автоматически, но мне не нравятся представления editText . Любые идеи о том, почему это происходит. Должен ли я использовать HoloTheme и разглашать взгляды по-разному?

Опять же, я не получаю никаких ошибок в затмении. Моя программа сбивается с того, что я могу расшифровать из logcat как исключение нулевого указателя.

Из документации, к которой вы подключились:

Если у вас есть пользовательская тема, в которой вы хотите удалить панель действий, установите для android:windowActionBar style значение false . Тем не менее, если вы удалите панель действий с помощью темы, то окно не позволит панели действий вообще, поэтому вы не можете добавить ее позже – вызов getActionBar() возвращает null .

Поскольку вы используете тему без панели действий, getACtionBar() возвращает значение null , а затем вы пытаетесь вызвать show() на этом null , в результате чего создается Исключение.

Таким образом, объясняется ошибка, которую вы получаете. Что касается этого, в документации для ActionBar говорится:

Начиная с Android 3.0 (уровень API 11) панель действий отображается в верхней части окна действия, когда активность использует тему Holo в системе (или одну из ее тем-потомков), которая является значением по умолчанию. Вы можете добавить панель действий, вызвав requestFeature(FEATURE_ACTION_BAR) или объявив ее в пользовательской теме с свойством windowActionBar .

Это дает вам два простых варианта иметь ActionBar без использования темы Holo. Это, пожалуй, проще всего в вашем случае:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().requestFeature(Window.FEATURE_ACTION_BAR); // Add this line setContentView(R.layout.inbox); ActionBar actionBar = getActionBar(); actionBar.show(); } 

Обновление. Вы также должны переключиться на « Theme.Black без части NoTitleBar , так как это предотвратит работу ActionBar.

Я столкнулся с той же проблемой. В конце концов я придумал разумное решение. У меня есть min api версия 8 с целевым api 11. Мне не нравятся стили голо, так что я переопределяю стили следующим образом:

Во-первых, вам нужно создать папку «res / values-v11». У вас, вероятно, уже есть папка «values», просто создайте «values-v11» на том же уровне (неважно, каков ваш целевой уровень API … aways использует «values-v11»).

После его создания вы создаете XML-документ, содержащий вашу тему в каждой из папок. Папка исходных значений будет использоваться для чего-либо меньшего, чем Android 3.0 (<api 11). Ваша тема будет выглядеть примерно так.

 <?xml version="1.0" encoding="utf-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="Theme.Black.OptionalActionBar" parent="@android:style/Theme.Black.NoTitleBar"> <item name="android:windowNoTitle">True</item> <item name="android:windowActionBar">False</item> </style> <style name="OptionalVisibility"> <item name="android:visibility">visible</item> </style> </resources> 

Обратите внимание, что я НЕ использую тему Holo, но вместо этого использую тему Theme.Black.NoTitleBar как родительскую. Оттуда я установил опции, чтобы скрыть заголовок окна и панель действий для вещей ниже, чем api 11.

Затем я создаю второй документ темы в папке «values-v11» и настраиваю его следующим образом:

 <?xml version="1.0" encoding="utf-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="Theme.Black.OptionalActionBar" parent="@android:style/Theme.Black.NoTitleBar"> <item name="android:windowNoTitle">false</item> <item name="android:windowActionBar">true</item> <item name="android:actionBarStyle">@android:style/Widget.Holo.ActionBar</item> </style> <style name="OptionalVisibility"> <item name="android:visibility">invisible</item> <item name="android:height">1dp</item> </style> </resources> 

В приведенной выше теме он позволяет панели действий и устанавливает ее с помощью темы Голо , но оставляет все остальные элементы в одиночку. Таким образом, панель действий выглядит «holo» -ish, но все остальное остается таким же, как и в более низких версиях (и я не получаю уродливую текстовую запись, которая поставляется с Holo).

Затем в манифесте, если я хочу, чтобы панель действий отображалась, я просто задал тему для этой активности для android:theme="@style/Theme.Black.OptionalActionBar"

Я сделал это специально, потому что я потерпел неудачу в своих макетах, опираясь на устаревшую кнопку меню аппаратного обеспечения. С помощью вышеприведенных тем я могу настроить панель действий, если это необходимо, или оставить ее в качестве меню, если это более старое устройство. Затем все, что мне нужно сделать, это установить одно свойство в моих методах создания меню для поддержки 2.0 – 4.0 без проблем.

Во всяком случае, посмотрите и посмотрите, доставит ли вы вас туда, где вам нужно.

На мой взгляд, это намного проще, чем другие подходы, потому что вам не нужно забывать запрашивать панель действий или делать что-либо в коде . Вы просто задали тему своей деятельности … и от вас.

Что Даршан сказал … вроде

Чтобы пойти немного дальше, я бы проверил ActionBarSherlock, в сочетании с библиотекой поддержки вы можете добавить панель действий практически в любую версию Android, которая равна 2.x +

Чтобы получить полный экран / без заголовка, вы должны создать свою собственную тему из одной из тем ABS, аналогичной

 <style name="Theme.MY.Sherlock.Fullscreen" parent="Theme.Sherlock.Light.DarkActionBar"> <item name="android:windowFullscreen">true</item>; </style> 

Применение этой темы в вашем onCreate, а затем получение строки действий для отображения одинаково (за исключением того, что вы используете префикс поддержки ABS), в основном

 setTheme(R.style.Theme_MY_Sherlock_Fullscreen); setContentView(R.layout.mylayout); getSupportActionBar.Show(); 

Я предполагаю, что вы можете сделать то же самое для стандартной панели действий (с использованием голосовой темы в качестве базы), так как АБС в значительной степени дублирует функциональность (и большая часть исходного кода, ABS в основном является классом-оболочкой), он даже обнаруживает, а затем Использует встроенную реализацию на 14 и выше (11 и между ними есть некоторые недостающие функции / исправления)

Вы можете взглянуть на ABS здесь, и похоже, что он просто обновил его до JB

– В папке ресурсов под значениями создайте файл themes.xml (/res/values/themes.xml)

Затем добавьте это и дайте вышеприведенную попытку, но, конечно, в setTheme (замените имя Theme_My_Holo_FullScreen и не используйте префикс getSupportActionbar (). Я никогда не буду использовать встроенную реализацию, но она должна работать одинаково.

 <?xml version="1.0" encoding="utf-8"?> <resources> <style name="Theme.My.Holo.Fullscreen" parent="Theme.Holo"> <item name="android:windowFullscreen">true</item>; </style> </resources> 
Intereting Posts
Эмуляторные файлы Temp съедают мой диск Как открыть навигационный ящик без панели действий, открыть с помощью одной кнопки Записывайте звук в Android и читайте Amplitude Android Canvas.drawText не отображается Мультимедийные помехи для Android Как самостоятельно опубликовать приложение для Android Как сделать запрос соединения в Firebase Android Элементы не имеют одинаковой ширины при использовании утилиты RecyclerView GridLayoutManager для создания интервала столбцов с помощью ItemDecoration Android Wear: работает только «Simple», все остальные черные AudioCache: переполнение размера кучи! Req Sixe: xxxx, max size: yyyy Всегда показывать службу в панели уведомлений Почему я получаю доступ к папке с данными при использовании adb? Отключите автоматическое соединение веб-просмотра Плохой вызов: указанный пакет com.google.android.play.games под uid 10238, но это действительно 10062 Как создать список и sublist -android?