getActionBar () возвращает null

У меня странная проблема. Я делаю приложение с targetdk 13.

В методе onCreate моего основного действия я вызываю getActionBar(), чтобы настроить панель действий. Это отлично работает при работе в эмуляторе Android 3.2, но при использовании Android 3.0 и 3.1 метод getActionBar() возвращает значение null.

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

РЕШЕНИЕ: Думаю, я нашел решение этой проблемы. Я не использовал setContentView для установки макета для действия. Вместо этого я использовал fragmentTransaction.add(android.R.id.content, mFragment, mTag), чтобы добавить фрагмент к активности. Это нормально работало в 3.2, но в более ранних версиях с сотами панель действий, по-видимому, не была установлена, если вы не используете setContentView в методе onCreate(). Поэтому я исправил это, используя метод setContentView() в моем методе onCreate() и просто снабдив его макетом, содержащим пустой FrameLayout. Я все еще могу использовать метод fragmentTransaction.add(android.R.id.content, mFragment, mTag) так же, как и раньше.

Это не самое красивое решение, но оно работает.


person Christian Skogsberg    schedule 28.07.2011    source источник
comment
как вы указали, отвечая на другой пост, вам нужна тема Holo. Не думаете, что вы указали свою голографическую тему только в папке с разрешением v13? Извините, если это звучит слишком очевидно.   -  person PJL    schedule 29.07.2011
comment
Нет, это тоже была моя первая мысль, но это не так. Спасибо за ответ.   -  person Christian Skogsberg    schedule 29.07.2011


Ответы (24)


Можно использовать getSupportActionBar() вместо getActionBar() метода.

person Amir    schedule 30.12.2014
comment
из всех отсюда, это сделало это для меня! - person msysmilu; 23.01.2015
comment
спасибо, я использовал android.support.v7.app.ActionBarActivity, так что это сделало это за меня. - person velval; 30.01.2015
comment
После 2 часов поисков! Переход на getSupportActionBar () и android.support.v7.app.ActionBarActivity, наконец, исправляет это для меня. - person FacePalm; 26.10.2015
comment
Это решение проблемы. - person zygimantus; 10.06.2016

Если вы используете библиотеку поддержки

import android.support.v7.app.ActionBarActivity;

public class MainActivity extends ActionBarActivity {

используйте getSupportActionBar() вместо getActionBar()

* Обновлять:

Класс ActionBarActivity теперь устарел:

import android.support.v7.app.ActionBarActivity;

Рекомендую использовать:

import android.support.v7.app.AppCompatActivity
person Jorgesys    schedule 21.03.2015
comment
внутри android.support.v7.app: ActionBarActivity устарело Вместо этого используйте android.support.v7.app.AppCompatActivity. - person A. Petrov; 07.07.2015

  1. если вы используете android.support.v7.app.AppCompatActivity

    открытый класс HomeActivity расширяет AppCompatActivity {

Тогда вы должны использовать android.support.v7.app.ActionBar

  ActionBar ab = getSupportActionBar();
  1. Если вы используете android.support.v4.app.FragmentActivity

    открытый класс HomeActivity расширяет FragmentActivity {

тогда вы должны использовать android.app.ActionBar

    ActionBar ab = getActionBar();
  1. Если вы используете android.support.v7.app.ActionBarActivity

    открытый класс HomeActivity расширяет ActionBarActivity {

вы должны использовать android.support.v7.app.ActionBar

   ActionBar ab = getSupportActionBar();
person Hitesh Sahu    schedule 27.01.2016
comment
Отличный ответ, устраняет путаницу !! - person sud007; 26.07.2016

Вы должны определить тип окна как панель действий до того, как действие отобразит свое представление.

использовать

requestWindowFeature(Window.FEATURE_ACTION_BAR);

перед вызовом метода setContentView ().

person kaushal trivedi    schedule 26.08.2013
comment
Если getSupportActionBar () не работает, значит, это работает как шарм - person Ashwin Balani; 12.06.2018

Я столкнулся с вышеуказанной проблемой, когда метод getActionBar() возвращает значение null. Я звонил getActionBar() после установки setContentView() и все равно возвращал null.

Я решил проблему, установив версию min-sdk в файле манифеста Android, который изначально отсутствовал. <uses-sdk android:minSdkVersion="11" />

person Rajendra    schedule 18.10.2011
comment
Это сэкономило мне столько времени! Любой, кто использует пример приложения Bluetooth Chat в Android SDK, должен использовать это исправление. Манифест приложения не включает пространство имен android: в свой тег minSdkVersion и поэтому не регистрируется. Добавление пространства имен устраняет ошибку, при которой панель действий не обнаруживается. Неряшливо, Google! - person Nick; 29.11.2012
comment
На самом деле вам может просто потребоваться указать targetSdkVersion. Вы можете работать с более низким значением minSdkVersion, если используете библиотеку compat, но targetSdkVersion определяет поведение. - person William; 23.12.2013
comment
Большой!! это то, что я искал. - person swiftBoy; 19.02.2014
comment
‹Uses-sdk android: minSdkVersion = 11 /› решил мою проблему, спасибо - person Majid; 27.06.2015

ActionBar требует, чтобы у темы приложения или действия был заголовок. Убедитесь, что вы не использовали стиль для своего приложения или действия как Theme.NOTITLE.

<application
    android:name="com.xxx.yyy"
    android:debuggable="false"
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:theme="@style/Theme.NoTitle"> // remove this line if you have this in your code


<activity
        android:name="com.xxx.yyy.Activity"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:theme="@style/Theme.NoTitle"  // remove this line if you have in your code
        android:windowSoftInputMode="adjustResize|stateHidden" > 
person Himanshu Virmani    schedule 11.06.2013

import android.support.v7.app.AppCompatActivity;

тогда

extends AppCompatActivity

тогда используйте

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
person Abilash Rajasekaran    schedule 19.08.2016
comment
исправляет мою проблему в примере ящика навигации Google. - person Weishi Z; 18.10.2016
comment
Хорошее решение, но для тех, кто будет его реализовывать, скорее всего, будут ошибки, связанные с совместимостью. Если вы это сделаете, обязательно проверьте свой импорт s.a. android.support.v4.app.FragmentTransaction вместо android.app.FragmentTransaction и android.support.v7.app.ActionBar вместо android.app.ActionBar - person Sergei Emelianov; 11.09.2017

Этот ответ запоздалый, но может быть полезен всем, кто пришел из Google: вам вполне может потребоваться объявить

<item name="android:windowActionBar">true</item>

в вашем styles.xml. Кажется, false может быть значением по умолчанию. Вы также должны быть на API 11 или выше.

Более подробную информацию можно найти в документации, здесь. В частности, цитата:

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

person SK9    schedule 22.06.2013

У меня была та же проблема, и одним из решений было использовать setContentView() перед вызовом getActionBar().

Но была еще одна вещь, которая устранила проблему. Я указал тему для приложения @android:style/Theme.Holo.Light.

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.Holo.Light" >
    ...
</application>

Думаю, можно использовать любую тему, в которой есть <item name="android:windowActionBar">true</item>.

person ntoskrnl    schedule 03.10.2014
comment
Спасибо, у меня работает. В моем случае метод getActionBar () также вернул значение null, и я смог решить его, изменив стиль темы на Theme.Holo.Light. В некоторых других темах (например, Theme.AppCompat) кажется, что ActionBar не активен, поэтому его значение равно нулю. - person harrakiss; 31.12.2014

Основная причина этого - использование тем, которые не поддерживают ActionBar:

В файле манифеста добавьте следующее либо в целевое действие, либо в элемент приложения (если вы хотите унифицировать тему для всего приложения)

Примеры тем, поддерживающих панель действий "Theme.AppCompat.Light" или "Theme.Holo.Light" ...

android:theme="@android:style/Theme.Holo.Light"

Лучше поместить все стили в styles.xml и использовать его везде, используя "@style/themName", так что предыдущий будет

android:theme="@style/AppTheme"

а в файле styles.xml будет следующее:

 <style name="AppTheme" parent="Theme.AppCompat.Light">

Подсказки:

  • Некоторые темы нельзя использовать в старых SDK, например "@android:style/Theme.Holo.Light.DarkActionBar" не поддерживается до версии SDK 14.
  • Чтобы ваше приложение могло поддерживать минимальную конкретную версию SDK, вы можете добавить следующее в элемент <app>:

    <uses-sdk android:minSdkVersion="14" />
    
  • Чтобы указать минимальную версию SDK в AndroidStudio, вы можете использовать файл Gradle приложения.

    android{
      defaultConfig{
        minSdkVersion 14
        targetSdkVersion 21
      }
    }
    
person Muhammad Soliman    schedule 31.01.2015
comment
но что мне делать для поддержки уровня API 9-13, если я использую Theme.Holo.Light.DarkActionBar - person Sid; 20.03.2017

Я столкнулся с этой проблемой. Я проверял номер версии и включал панель действий, только если она больше или равна Honeycomb, но она возвращала null. Я нашел причину и основную причину в том, что я отключил стиль Holo Theme в style.xml в папке values-v11.

person Pratap Singh    schedule 08.04.2013
comment
Моя проблема решена с использованием Holo Theme в качестве родительской темы для моей AppTheme. - person Bharat Dodeja; 19.03.2015

перейдите в AndroidManifest.xml и замените

android: theme = "@ style / AppTheme"

by 

android: theme = "@ android: style / Theme.Holo.Light.DarkActionBar"

person NEERAJ GUPTA    schedule 29.01.2016

Используйте getSupportActionBar () вместо getActionBar ()

person sonal balekai    schedule 28.03.2018

В моем случае это было в моем коде, который не работал:

@Override
protected void onCreate(Bundle savedInstanceState) {
    context = getApplicationContext();

    requestWindowFeature(Window.FEATURE_ACTION_BAR);

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
}

Затем я поиграл с порядком кода:

@Override
protected void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_ACTION_BAR);

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    context = getApplicationContext();
}

И это сработало!

Вывод: requestWindowFeature должен быть первым, что вы вызываете в методе onCreate.

person Simon    schedule 21.03.2015

Я была такая же проблема. Это решено путем изменения темы приложения в styles.xml

До

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

После

<!-- Base application theme. -->
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
person Jafar Karuthedath    schedule 26.10.2017

Одна вещь, которую я хотел добавить, так как я только что столкнулся с этим, если вы пытаетесь getActionBar () для Activity, у которого есть родитель, он вернет null. Я пытаюсь реорганизовать код, в котором моя Activity содержится внутри ActivityGroup, и мне потребовалось несколько минут, чтобы сказать «о, черт» после того, как я посмотрел на источник создания ActionBar в исходном коде.

person C Nick    schedule 28.02.2012
comment
не могли бы вы опубликовать свое решение для групп активности? - person Anthea; 12.09.2012
comment
Мое решение, насколько я помню, заключается в том, что я реорганизовал свой код, чтобы не использовать ActivityGroups. Извините, у меня нет фрагментов кода :( - person C Nick; 12.09.2012
comment
На самом деле это не решение; больше комментария. Но очень полезно! - person Kato; 26.10.2016

Я решаю это следующими изменениями:

  1. изменение в minifest android:theme="@android:style/Theme.Holo.Light" >
  2. добавить в класс extends ActionBarActivity
  3. добавить импорт в класс import android.support.v7.app.ActionBarActivity
person Sharon or Weissberg    schedule 29.10.2015

Чтобы добавить к другим ответам:

Убедитесь, что вы вызываете setActionBar() или setSupportActionBar() в своем onCreate() методе перед вызовом getActionBar():

Определите панель инструментов в своем activity.xml, а затем в onCreate ():

Toolbar toolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(toolbar);
// Now you can use the get methods:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
person A-Sharabiani    schedule 18.03.2018

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

У меня есть виджет, который представляет собой плавающее окно без заголовка. Я использую тему стиля для реализации android:windowIsFloating, android:backgroundDimEnabled и android:windowNoTitle. Виджет работал нормально, пока я не захотел добавить кнопку, которая вызывала пейджер фрагментов с несколькими страницами фрагментов списка и использовала ActionBar. Это привело бы к сбою при работе пейджера с исключением нулевого указателя. Я сузил его до нулевого значения ActionBar. Следуя выводам предыдущих людей, которые внесли свой вклад в эту ветку, я удалил свою тему из файла манифеста, и ActionBar работал нормально, но теперь мое окно больше не перемещалось (оно было полноэкранным), и у него был заголовок страницы, который мне не нужен.

Дальнейшее исследование привело меня к Руководству по обучению API стилей и тем, которое привело меня к раствору. Я обнаружил, что могу добавить свою настраиваемую тему к отдельным действиям в файле манифеста, тогда как раньше я применял ее к приложению. Все мои окна теперь имеют желаемый вид.

person DocM    schedule 09.07.2013

Попробуйте расширить свой класс Activity из ActionBarActivity. Это решило проблему для меня. Сделайте что-нибудь вроде следующего:

public class MyActivity extends ActionBarActivity
{
  . . .

В моем случае класс расширялся только из Activity.

person Alyoshak    schedule 16.12.2014

Некоторым это также может помочь.

В моем случае это произошло потому, что я не определил контекст в menu.xml.

Попробуй это:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.android.ActionBarActivity">

Вместо этого:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
person ElaGorilaki    schedule 24.02.2015

Просто проверьте реализацию исходного кода командой click:

    private void initWindowDecorActionBar() {
    Window window = getWindow();

    // Initializing the window decor can change window feature flags.
    // Make sure that we have the correct set before performing the test below.
    window.getDecorView();

    if (isChild() || !window.hasFeature(Window.FEATURE_ACTION_BAR) || mActionBar != null) {
        return;
    }

    mActionBar = new WindowDecorActionBar(this);
    mActionBar.setDefaultDisplayHomeAsUpEnabled(mEnableDefaultActionBarUp);

    mWindow.setDefaultIcon(mActivityInfo.getIconResource());
    mWindow.setDefaultLogo(mActivityInfo.getLogoResource());
}

requestWindowFeature (Window.FEATURE_ACTION_BAR); Исправлена ​​моя проблема, когда я увидел, что requestWindowFeature (Window.FEATURE_ACTION_BAR) не работает; код с открытым исходным кодом, используйте его !!

person Ankish Jain    schedule 05.11.2015

android.support.v7.app.ActionBar actionBar = getSupportActionBar();

работает довольно быстро

person Akhila Madari    schedule 04.09.2018
comment
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа. - person Nic3500; 05.09.2018

В моем случае мне просто пришлось расширить AppCompatActivity вместо Activity

    supportActionBar?.setDisplayHomeAsUpEnabled(true)

Полный пример класса активности:

импорт android.os.Bundle импорт androidx.appcompat.app.AppCompatActivity

//class LocationFound : Activity() { <-----Does not seem to work with ActionBar in recent versions
class LocationFound : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_location_found)

        supportActionBar?.setDisplayHomeAsUpEnabled(true)
    } }

О версиях

    minSdkVersion 22
    targetSdkVersion 29
person DaddyMoe    schedule 12.06.2019