android - getActionBar() devuelve nulo
android-3.0-honeycomb android-actionbar (22)
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 método getActionBar()
devuelve null.
Encuentro esto extremadamente extraño, y no veo ninguna razón por la que lo haga. ¿Es esto un error con los emuladores o hay algo que deba hacer, para asegurar que mi aplicación tenga una barra de acciones?
SOLUCIÓN: creo que encontré 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 las versiones anteriores de Honeycomb aparentemente la barra de acciones no está configurada si no usas el setContentView en el método onCreate()
. Así que lo arreglé usando el método setContentView()
en mi método onCreate()
y simplemente proporcioné un diseño que contenía un FrameLayout vacío. Todavía puedo usar el método fragmentTransaction.add(android.R.id.content, mFragment, mTag)
la misma manera que antes.
No es la solución más bonita, pero funciona.
Si está utilizando la biblioteca de soporte
import android.support.v7.app.ActionBarActivity;
public class MainActivity extends ActionBarActivity {
use getSupportActionBar()
lugar de getActionBar()
* Actualización:
La clase ActionBarActivity ahora está en desuso:
import android.support.v7.app.ActionBarActivity;
Recomiendo usar:
import android.support.v7.app.AppCompatActivity
si está usando android.support.v7.app.AppCompatActivity
la clase pública HomeActivity extends AppCompatActivity {
Entonces deberías estar usando android.support.v7.app.ActionBar
ActionBar ab = getSupportActionBar();
Si está utilizando android.support.v4.app.FragmentActivity
la clase pública HomeActivity extends FragmentActivity {
entonces deberías estar usando android.app.ActionBar
ActionBar ab = getActionBar();
Si está utilizando android.support.v7.app.ActionBarActivity
la clase pública HomeActivity extends ActionBarActivity {
deberías estar usando android.support.v7.app.ActionBar
ActionBar ab = getSupportActionBar();
ActionBar necesita una aplicación o tema de 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" >
Debe definir el tipo de ventana como barra de acciones antes de que la actividad represente su vista.
utilizar
requestWindowFeature(Window.FEATURE_ACTION_BAR);
antes de llamar al método setContentView ()
En mi caso, tuve 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 debe ser lo primero que llame en el método onCreate.
Esta respuesta es tardía, pero podría ser útil para cualquiera que llegue de Google: es posible que deba declarar
<item name="android:windowActionBar">true</item>
en su styles.xml
. Parece false
puede ser el predeterminado. También necesita estar en API 11 o superior.
Más detalles se pueden encontrar en la documentación here . Específicamente, cita:
Sugerencia: si tiene un tema de actividad personalizado en el que desea eliminar la barra de acciones, establezca la propiedad del estilo de android: windowActionBar en false. Sin embargo, si quita la barra de acciones con un tema, entonces la ventana no permitirá la barra de acciones, por lo que no podrá agregarla más tarde; la llamada a getActionBar () devolverá nulo.
Esto también puede ayudar a algunas personas.
En mi caso, fue porque no había definido un contexto en el menú.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">
Intenta extender tu clase de actividad desde ActionBarActivity. Esto lo resolvió para mí. Haz algo como lo siguiente:
public class MyActivity extends ActionBarActivity
{
. . .
En mi caso, la clase se estaba extendiendo solo desde Activity.
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 son compatibles con la barra de acciones "Theme.AppCompat.Light"
o "Theme.Holo.Light"
...
android:theme="@android:style/Theme.Holo.Light"
Es mejor poner todos los estilos en styles.xml
y usarlo en todas partes usando "@style/themName"
para que el anterior sea
android:theme="@style/AppTheme"
y styles.xml tendrá lo siguiente:
<style name="AppTheme" parent="Theme.AppCompat.Light">
Sugerencias:
- Hay algunos temas que no se pueden usar en SDK antiguos, como
"@android:style/Theme.Holo.Light.DarkActionBar"
no es compatible con SDKs versión 14. Para permitir que su aplicación sea compatible con la versión mínima específica de SDK, puede agregar lo siguiente en el elemento
<app>
:<uses-sdk android:minSdkVersion="14" />
Para especificar la versión mínima del SDK en AndroidStudio, puede usar el archivo Gradle de la aplicación.
android{ defaultConfig{ minSdkVersion 14 targetSdkVersion 21 } }
Lo resuelvo por estos cambios:
- cambiar en minifest de
android:theme="@android:style/Theme.Holo.Light" >
- agregar a la clase
extends ActionBarActivity
- agregar importación a la clase
import android.support.v7.app.ActionBarActivity
Me encontré con este problema. Estaba comprobando el número de versión y habilitando la barra de acción solo si es mayor o igual que Honeycomb, pero estaba devolviendo nulo. Descubrí que el motivo y la causa raíz era que había desactivado el estilo Holo Theme en style.xml en la carpeta values-v11.
Me enfrenté al problema anterior donde el método getActionBar()
devuelve null. Estaba llamando al getActionBar()
después de establecer el setContentView()
y todavía está devolviendo un null
.
Resolví el problema estableciendo la versión min-sdk en el archivo de manifiesto de Android que faltaba inicialmente. <uses-sdk android:minSdkVersion="11" />
Para agregar a las otras respuestas:
Asegúrese de llamar a setActionBar()
o setSupportActionBar()
en su método onCreate()
antes de llamar a 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);
Puede usar el getSupportActionBar()
lugar de getActionBar()
.
Sé que llego tarde a la fiesta (y soy nuevo en Android) sobre 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 yo quería en caso de que otros como yo vinieran. 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:backgroundDimEnabled
y android:windowNoTitle
. El widget funcionó bien hasta que quise agregar un botón que llamaba a un localizador de fragmentos con varias páginas de fragmento de lista y utilizaba la barra de acciones. Se bloquearía en la actividad del buscapersonas con una excepción de puntero nulo. Lo reduje a ActionBar siendo nulo. 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 ahora flotaba más (era de 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 API de estilos y temas que me condujo a una solución. Descubrí que podía agregar mi tema personalizado a actividades individuales en el archivo de manifiesto, mientras que antes lo estaba aplicando a la aplicación. Todas mis ventanas ahora tienen la apariencia deseada.
Simplemente verifique la implementación del código fuente con un clic de 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); Se corrigió mi problema porque vi que requestWindowFeature (Window.FEATURE_ACTION_BAR) estaba fallando; el código es de código abierto ¡Úselo!
Tuve el mismo problema y una de las soluciones fue usar setContentView()
antes de llamar a getActionBar()
.
Pero hubo otra cosa que solucionó el problema. Especifiqué el tema para la aplicación para que sea @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 se puede usar cualquier tema que tenga <item name="android:windowActionBar">true</item>
en él.
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">
Una cosa que quería agregar desde que me encontré con esto, si está tratando de obtener ActionBar () en una actividad que tiene un padre, devolverá nulo. Estoy tratando de refactorizar el código donde mi Activity está contenida dentro de un ActivityGroup, y me llevó unos minutos ir "oh duh" después de ver la fuente de cómo se crea una ActionBar en el código fuente.
Utilice getSupportActionBar () en lugar de getActionBar ()
vaya a AndroidManifest.xml y reemplace
android: theme = "@ style / AppTheme"
by
android: theme = "@ android: style / Theme.Holo.Light.DarkActionBar"
import android.support.v7.app.AppCompatActivity;
entonces
extends AppCompatActivity
luego usa
getSupportActionBar().setDisplayHomeAsUpEnabled(true);