getActionBar () devuelve nulo

176

Estoy teniendo un problema extraño Estoy haciendo una aplicación con targetsdk 13.

En el método onCreate de mi actividad principal, llamo getActionBar()para configurar mi barra de acciones. Esto funciona bien cuando se ejecuta en el emulador de Android 3.2, pero cuando se usa Android 3.0 y 3.1 el getActionBar()método devuelve nulo.

Esto me parece extremadamente extraño, y no puedo ver ninguna razón por la que lo haría. ¿Es esto un error con los emuladores o hay algo que deba hacer para garantizar que mi aplicación tenga una barra de acción?

SOLUCIÓN: Creo que he encontrado una solución para este problema. No estaba usando setContentView para establecer un diseño para la actividad. En cambio, estaba usando fragmentTransaction.add(android.R.id.content, mFragment, mTag)para agregar un fragmento a la actividad. Esto funcionó bien en 3.2, pero en versiones anteriores de nido de abeja, la barra de acción aparentemente no se establece si no usa setContentView en el onCreate()método. Así que lo arreglé utilizando el setContentView()método en mi onCreate()método y simplemente proporcionándole un diseño que contenía un FrameLayout vacío. Todavía puedo usar el fragmentTransaction.add(android.R.id.content, mFragment, mTag)método de la misma manera que antes.

No es la solución más bonita, pero funciona.

Christian Skogsberg
fuente
Como señaló al responder otra publicación, necesita un tema Holo. ¿No supone que especificó su tema holo en una carpeta res v13 solamente? Lo siento si eso suena demasiado obvio.
PJL
No, ese fue mi primer pensamiento también, pero ese no es el caso. Gracias por tu respuesta sin embargo.
Christian Skogsberg

Respuestas:

226

Se puede usar en getSupportActionBar()lugar de getActionBar()método.

Amir
fuente
fuera de todo desde aquí, ¡esto lo hizo por mí!
msysmilu
16
gracias, estaba usando "android.support.v7.app.ActionBarActivity", así que esto lo hizo por mí.
velval
1
¡Después de 2 horas de búsqueda! Cambiar a getSupportActionBar () y android.support.v7.app.ActionBarActivity finalmente me lo soluciona.
FacePalm
Esta es la solución al problema.
zygimantus
46

Si está utilizando la biblioteca de soporte

import android.support.v7.app.ActionBarActivity;

public class MainActivity extends ActionBarActivity {

usar en getSupportActionBar()lugar degetActionBar()

* Actualización:

La clase ActionBarActivity ahora está en desuso:

import android.support.v7.app.ActionBarActivity;

Recomiendo usar:

import android.support.v7.app.AppCompatActivity
Jorgesys
fuente
dentro android.support.v7.app: ActionBarActivityuso obsoleto en su android.support.v7.app.AppCompatActivitylugar.
A. Petrov
35

Debe definir el tipo de ventana como barra de acción antes de que la actividad muestre su vista.

utilizar

requestWindowFeature(Window.FEATURE_ACTION_BAR);

antes de llamar al método setContentView ().

kaushal trivedi
fuente
Si getSupportActionBar () no funciona, entonces esto funciona de maravilla
Ashwin Balani
35
  1. si está utilizando android.support.v7.app.AppCompatActivity

    clase pública HomeActivity extiende AppCompatActivity {

Entonces deberías estar usando android.support.v7.app.ActionBar

  ActionBar ab = getSupportActionBar();
  1. Si está utilizando android.support.v4.app.FragmentActivity

    clase pública HomeActivity extiende FragmentActivity {

entonces deberías estar usando android.app.ActionBar

    ActionBar ab = getActionBar();
  1. Si estas usando android.support.v7.app.ActionBarActivity

    clase pública HomeActivity extiende ActionBarActivity {

deberías estar usando android.support.v7.app.ActionBar

   ActionBar ab = getSupportActionBar();
Hitesh Sahu
fuente
Gran respuesta, aborda la confusión !!
sud007
31

Me enfrenté al problema anterior donde el getActionBar()método devuelve nulo. Estaba llamando al getActionBar()después de configurar el setContentView()y todavía está regresando a null.

Resolví el problema configurando la versión min-sdk en el archivo de manifiesto de Android que faltaba inicialmente. <uses-sdk android:minSdkVersion="11" />

Rajendra
fuente
44
¡Esto me ahorró mucho tiempo! Cualquier persona que use la aplicación de ejemplo Bluetooth Chat en el SDK de Android debe usar esta solución. El manifiesto de la aplicación no incluye el espacio de nombres "android:" en su etiqueta minSdkVersion, por lo que no se registra. Agregar el espacio de nombres corrige un error con la barra de acción que no se encuentra. ¡Descuidado, Google!
Nick
En realidad, es posible que solo necesite especificar targetSdkVersion. Puede ejecutar con una minSdkVersion más baja si está utilizando la biblioteca de compatibilidad, pero targetSdkVersion determina el comportamiento.
William
¡¡Excelente!! Esto es lo que estaba buscando.
swiftBoy
<uses-sdk android: minSdkVersion = "11" /> resolvió mi problema gracias
Majid
27

ActionBar necesita el tema de la aplicación o actividad para tener un título de aplicación. Asegúrese de no haber diseñado su aplicación o actividad como 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" > 
Himanshu Virmani
fuente
19
import android.support.v7.app.AppCompatActivity;

luego

extends AppCompatActivity

luego usa

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Abilash Rajasekaran
fuente
soluciona mi problema en el ejemplo del cajón de navegación de google.
Weishi Zeng
Buena solución, sin embargo, para aquellos que la implementarán, lo más probable es que obtengan errores basados ​​en compatibilidad. Si lo hace, asegúrese de verificar sus importaciones en android.support.v4.app.FragmentTransaction en lugar de solo android.app.FragmentTransaction y android.support.v7.app.ActionBar en lugar de android.app.ActionBar
Serj Ardovic
18

Esta respuesta llega tarde pero puede ser útil para cualquier persona que llegue de Google: es posible que deba declarar

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

en su styles.xml. Parece que falsepuede ser el predeterminado. También debe estar en API 11 o superior.

Más detalles se pueden encontrar en la documentación aquí . Específicamente, cite:

Sugerencia: Si tiene un tema de actividad personalizado en el que desea eliminar la barra de acción, establezca la propiedad de estilo android: windowActionBar en false. Sin embargo, si quita la barra de acción utilizando un tema, la ventana no permitirá la barra de acción, por lo que no podrá agregarla más tarde; llamar a getActionBar () devolverá nulo.

SK9
fuente
11

Tuve el mismo problema y una de las soluciones fue usar setContentView()antes de llamar getActionBar().

Pero había otra cosa que solucionó el problema. Especifiqué el tema para la aplicación @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>

Creo que <item name="android:windowActionBar">true</item>se puede usar cualquier tema que tenga .

ntoskrnl
fuente
Gracias, funciona para mi. En mi caso, el método getActionBar () también devolvió nulo y pude resolverlo cambiando el estilo del tema a Theme.Holo.Light. Con algunos otros temas (por ejemplo, Theme.AppCompat), parece que ActionBar no está activo, por lo que su valor es nulo.
harrakiss
10

La razón principal de esto es usar temas que no son compatibles con ActionBar:

En el archivo de manifiesto, agregue lo siguiente en su actividad de destino o en el elemento de la aplicación (si desea unificar el tema en toda la aplicación)

Ejemplos de temas que admiten barra de acción "Theme.AppCompat.Light"o "Theme.Holo.Light"...

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

Es mejor poner todos los estilos styles.xmly usarlos en todas partes "@style/themName"para que el anterior sea

android:theme="@style/AppTheme"

y styles.xml tendrá lo siguiente:

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

Consejos:

  • Hay algunos temas que no se pueden usar en SDK antiguos, como "@android:style/Theme.Holo.Light.DarkActionBar"no se admite antes de SDK versión 14.
  • Para permitir que su aplicación admita una versión mínima específica de SDK, puede agregar el siguiente <app>elemento:

    <uses-sdk android:minSdkVersion="14" />
  • Para especificar la versión mínima de SDK en AndroidStudio, puede hacerlo utilizando el archivo Gradle de la aplicación.

    android{
      defaultConfig{
        minSdkVersion 14
        targetSdkVersion 21
      }
    }
Muhammad Soliman
fuente
pero ¿qué debo hacer para admitir el nivel de API 9-13, en caso de que use Theme.Holo.Light.DarkActionBar
Sid
8

Me encontré con este problema. Estaba buscando el número de versión y habilitando la barra de acción solo si es mayor o igual a Honeycomb, pero estaba regresando nulo. Encontré que la razón y la causa raíz era que había deshabilitado el estilo Holo Theme en style.xml en la carpeta values-v11.

Pratap Singh
fuente
He resuelto mi problema utilizando Holo Theme como tema principal de mi AppTheme.
Bharat Dodeja
7

vaya al AndroidManifest.xml y reemplace

android: theme = "@ style / AppTheme"

by 

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

NEERAJ GUPTA
fuente
6

Use getSupportActionBar () en lugar de getActionBar ()

sonal balekai
fuente
4

En mi caso, tenía esto en mi código que no funcionó:

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

    requestWindowFeature(Window.FEATURE_ACTION_BAR);

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
}

Luego jugué con el orden del código:

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

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    context = getApplicationContext();
}

¡Y funcionó!

Conclusión: requestWindowFeature debería ser lo primero que llame en el método onCreate.

Simón
fuente
3

Tuve el mismo problema. Se resolvió cambiando el tema de la aplicación en styles.xml

antes de

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

Después

<!-- Base application theme. -->
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
jafarmlp
fuente
2

Una cosa que quería agregar ya que me encontré con esto, si está tratando de obtenerActionBar () en una actividad que tiene un padre, devolverá nulo. Estoy tratando de refactorizar el código donde mi Actividad está contenida dentro de un Grupo de Actividad, y me tomó unos pocos minutos para ir "oh duh" después de mirar la fuente de cómo se crea una ActionBar en la fuente.

C Nick
fuente
¿podría publicar su solución para grupos de actividades?
Anthea
Mi solución de lo que recuerdo es refactorizar mi código para no usar ningún ActivityGroups. Lo siento, no tengo fragmentos de código :(
C Nick
Esto no es realmente una solución; más de un comentario ¡Pero muy útil!
Kato
1

Lo resuelvo con estos cambios:

  1. cambio en minifest android:theme="@android:style/Theme.Holo.Light" >
  2. agregar a clase extends ActionBarActivity
  3. agregar importación a la clase import android.support.v7.app.ActionBarActivity
Sharon o Weissberg
fuente
1

Para agregar a las otras respuestas:

Asegúrese de llamar setActionBar()o setSupportActionBar()en su onCreate()método antes de llamar al getActionBar():

Defina alguna barra de herramientas en su activity.xml, luego en onCreate ():

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

Sé que llego tarde a la fiesta (y nuevo en Android) en esta pregunta, pero encontré la información aquí muy útil y pensé que debería agregar los hallazgos de mis propios esfuerzos para hacer que ActionBar funcione como quería en caso de que vengan otros como yo. en busca de ayuda.

Tengo un widget que es una ventana flotante sin título de ventana. Utilizo un tema de estilo para implementar android:windowIsFloating, android:backgroundDimEnabledyandroid:windowNoTitle . El widget funcionó bien hasta que quise agregar un botón que llamaba un buscapersonas de fragmentos con varias páginas de fragmentos de lista y utilizaba la Barra de acciones. Se bloquearía en la actividad del localizador con una excepción de puntero nulo. Lo reduje a la ActionBar siendo nula. Siguiendo los hallazgos de personas anteriores que contribuyeron a este hilo, eliminé mi tema del archivo de manifiesto y la Barra de acciones funcionó bien, pero ahora mi ventana ya no flotaba (era pantalla completa) y tenía un título de página que no quería.

Investigaciones adicionales me llevaron a la Guía de capacitación de API de estilos y temas que me llevó a una solución. Descubrí que podía agregar mi tema personalizado a actividades individuales en el archivo de manifiesto, mientras que antes lo aplicaba a la aplicación. Todas mis ventanas ahora tienen la apariencia deseada.

DocM
fuente
0

Intenta extender tu clase de actividad desde ActionBarActivity. Esto lo resolvió para mí. Haga algo como lo siguiente:

public class MyActivity extends ActionBarActivity
{
  . . .

En mi caso, la clase se extendía solo desde Actividad.

Alyoshak
fuente
0

Esto también puede ayudar a algunas personas.

En mi caso, fue porque no había definido un contexto en el menu.xml

Prueba esto:

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

En lugar de esto:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
ElaGorilaki
fuente
0

Simplemente verifique la implementación del código fuente haciendo clic en el comando:

    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); Solucioné mi problema cuando vi requestWindowFeature (Window.FEATURE_ACTION_BAR) está fallando; el código es de código abierto úsalo !!

Ankish Jain
fuente
0

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

funciona bastante rápido

Akhila Madari
fuente
3
Si bien este código puede responder la pregunta, proporcionar un contexto adicional sobre cómo y / o por qué resuelve el problema mejoraría el valor a largo plazo de la respuesta.
Nic3500
0

En mi caso, simplemente tuve que extender en AppCompatActivitylugar deActivity

    supportActionBar?.setDisplayHomeAsUpEnabled(true)

Clase de ejemplo de actividad completa:

import android.os.Bundle import 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)
    } }

En versiones

    minSdkVersion 22
    targetSdkVersion 29
DaddyMoe
fuente