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.


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.


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

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 ().


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();

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


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

19
import android.support.v7.app.AppCompatActivity;

luego

extends AppCompatActivity

luego usa

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

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.


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 .


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

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.


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"



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.


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

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.


¿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

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);

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.


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.


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

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


0

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

funciona bastante rápido


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.