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

Я пытаюсь добавить панель действий программно, как показано надокументация разработчика но я столкнулся с ошибкой. Мой 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 как исключение нулевого указателя.

Ответы на вопрос(3)

Решение Вопроса

If you have a custom activity theme in which you'd like to remove the action bar, set the android:windowActionBar style property to false. However, if you remove the action bar using a theme, then the window will not allow the action bar at all, so you cannot add it later—calling getActionBar() will return null.

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

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

Beginning with Android 3.0 (API level 11), the action bar appears at the top of an activity's window when the activity uses the system's Holo theme (or one of its descendant themes), which is the default. You may otherwise add the action bar by calling requestFeature(FEATURE_ACTION_BAR) or by declaring it in a custom theme with the windowActionBar property.

Это дает вам два простых варианта иметь 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();
}

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

 EGHDK08 июл. 2012 г., 03:34
Я не уверен, как правильно читать logcat, так что я не знаю, как это выяснить. Сожалею. Я полагаю, что вы делаете, хотя!
 08 июл. 2012 г., 03:29
@EGHDK На какой линии?
 08 июл. 2012 г., 03:24
@EGHDK Я только что обновил свой ответ, чтобы объяснить, "что с этим делать" часть.
 EGHDK08 июл. 2012 г., 03:28
Все еще сбой моего приложения. Похоже, все еще получает nullPointer в logcat.
 EGHDK08 июл. 2012 г., 03:19
Так я должен добавить actionBar к самой теме? Спасибо за объяснение ошибки, хотя

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

Сначала необходимо создать & quot; res / values-v11 & quot; папка. Возможно, у вас уже есть «значения» просто создайте & quot; values-v11 & quot; на том же уровне (не имеет значения, какой у вас целевой уровень API ... всегда используйте "values-v11").

Как только это будет создано, вы создадите XML-документ, содержащий вашу тему в каждой из папок. Папка с исходными значениями будет использоваться для чего-то меньшего, чем Android 3.0 (& lt; 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.

Затем я создаю второй документ темы в & quot; values-v11 & quot; папку и настройте ее так:

<?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>

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

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

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

В любом случае, посмотрите и посмотрите, приведет ли это вас туда, где вы должны быть.

На мой взгляд, это намного проще, чем другие подходы, потому чтоyou don't have to remember to request the actionbar or do anything in code, Вы просто устанавливаете свою тему в своей деятельности ... и все готово.

 18 сент. 2013 г., 09:07
Тем не менее, это не работает. Пожалуйста, помогите мне в этом
 27 янв. 2013 г., 00:03
Как раз то, что я искал. Это должен быть помеченный ответ

Чтобы пойти немного дальше, я хотел бы проверить 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 в значительной степени дублирует функциональность (и большая часть источника, 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>
 EGHDK08 июл. 2012 г., 03:48
Благодарю. Это поможет мне много позже. Я ценю его.
 08 июл. 2012 г., 03:54
@EGHDK - обновлено, посмотрите, подходит ли вам это
 08 июл. 2012 г., 03:47
Стили находятся в /res/values/themes.xml, который я помещу в фрагменте файла выше - в режиме ожидания.
 EGHDK08 июл. 2012 г., 03:45
Да, я планирую внедрить ABS позже, но я растерялся из-за того, как я не могу реализовать панель действий сTheme.Black.noTitleBar для API уровня 11 и выше. Я все еще изучаю стили, хотя первый комментарий к вашему коду не имеет смысла для меня =) Куда делятся теги стилей?

Ваш ответ на вопрос