getActionBar () возвращает ноль - PullRequest
171 голосов
/ 29 июля 2011

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

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

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

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

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

Ответы [ 24 ]

211 голосов
/ 30 декабря 2014

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

46 голосов
/ 21 марта 2015

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

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
33 голосов
/ 26 августа 2013

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

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

requestWindowFeature(Window.FEATURE_ACTION_BAR);

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

32 голосов
/ 27 января 2016
  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();
31 голосов
/ 18 октября 2011

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

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

27 голосов
/ 11 июня 2013

ActionBar требуется приложение или тема действия, чтобы иметь название приложения. Убедитесь, что вы не назвали свое приложение или действие темой. ПРИМЕЧАНИЕ.

<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" > 
19 голосов
/ 19 августа 2016
import android.support.v7.app.AppCompatActivity;

тогда

extends AppCompatActivity

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

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
18 голосов
/ 22 июня 2013

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

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

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

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

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

10 голосов
/ 31 января 2015

Основная причина для этого - использование тем, которые не поддерживают 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
      }
    }
    
10 голосов
/ 03 октября 2014

У меня была та же проблема, и одним из решений было использование 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>.

...