getActionBar () restituisce null


176

Sto avendo un problema strano. Sto realizzando un'app con targetdk 13.

Nel metodo onCreate della mia attività principale, chiamo getActionBar()per configurare la mia barra delle azioni. Funziona bene quando si esegue sull'emulatore Android 3.2, ma quando si utilizza Android 3.0 e 3.1 il getActionBar()metodo restituisce null.

Lo trovo estremamente strano e non riesco a vedere alcun motivo per cui lo farebbe. Si tratta di un bug con gli emulatori o c'è qualcosa che devo fare per garantire che la mia applicazione abbia una barra delle azioni?

SOLUZIONE: penso di aver trovato una soluzione per questo problema. Non stavo usando setContentView per impostare un layout per l'attività. Invece stavo usando fragmentTransaction.add(android.R.id.content, mFragment, mTag)per aggiungere un frammento all'attività. Funzionava bene in 3.2, ma nelle precedenti versioni a nido d'ape apparentemente la barra delle azioni non è impostata se non si utilizza setContentView nel onCreate()metodo. Quindi l'ho corretto usando il setContentView()metodo nel mio onCreate()metodo e semplicemente fornendo un layout che conteneva un FrameLayout vuoto. Posso ancora usare il fragmentTransaction.add(android.R.id.content, mFragment, mTag)metodo allo stesso modo di prima.

Non è la soluzione più carina, ma funziona.


mentre indicavi di rispondere a un altro post, hai bisogno di un tema Holo. Non supponi di aver specificato il tuo tema holo solo in una cartella res v13? Scusa se sembra troppo ovvio.
PJL,

No, anche quello è stato il mio primo pensiero, ma non è così. Grazie comunque per la tua risposta.
Christian Skogsberg,

Risposte:


227

Può usare al getSupportActionBar()posto del getActionBar()metodo.


di tutto da qui, questo l'ha fatto per me!
msysmilu,

16
grazie, stavo usando "android.support.v7.app.ActionBarActivity" quindi questo è stato per me.
Velval,

1
Dopo 2 ore di ricerche! Il passaggio a getSupportActionBar () e android.support.v7.app.ActionBarActivity finalmente risolve il problema per me.
FacePalm,

Questa è la soluzione al problema.
zygimantus,

46

Se si sta utilizzando la libreria di supporto

import android.support.v7.app.ActionBarActivity;

public class MainActivity extends ActionBarActivity {

utilizzare getSupportActionBar()invece digetActionBar()

* Aggiornare:

La classe ActionBarActivity ora è obsoleta:

import android.support.v7.app.ActionBarActivity;

Consiglio di usare:

import android.support.v7.app.AppCompatActivity

entro android.support.v7.app: ActionBarActivityobsoleto Usa android.support.v7.app.AppCompatActivityinvece.
A. Petrov,

35

Devi definire il tipo di finestra come barra delle azioni prima che l'attività renda la sua vista.

uso

requestWindowFeature(Window.FEATURE_ACTION_BAR);

prima di chiamare il metodo setContentView ().


Se getSupportActionBar () non funziona, allora funziona come un incantesimo
Ashwin Balani,

35
  1. se stai usando android.support.v7.app.AppCompatActivity

    classe pubblica HomeActivity estende AppCompatActivity {

Quindi dovresti usare android.support.v7.app.ActionBar

  ActionBar ab = getSupportActionBar();
  1. Se stai usando android.support.v4.app.FragmentActivity

    classe pubblica HomeActivity estende FragmentActivity {

allora dovresti usare android.app.ActionBar

    ActionBar ab = getActionBar();
  1. Se stai usando android.support.v7.app.ActionBarActivity

    classe pubblica HomeActivity estende ActionBarActivity {

dovresti usare android.support.v7.app.ActionBar

   ActionBar ab = getSupportActionBar();

Ottima risposta, affronta la confusione !!
sud007,

31

Ho affrontato il problema precedente in cui il getActionBar()metodo restituisce null. Stavo chiamando il getActionBar()dopo aver impostato il setContentView()e ancora sta tornando a null.

Ho risolto il problema impostando la versione min-sdk nel file manifest di Android che mancava inizialmente. <uses-sdk android:minSdkVersion="11" />


4
Questo mi ha fatto risparmiare così tanto tempo! Chiunque utilizzi l'app di esempio Bluetooth Chat nell'SDK Android deve utilizzare questa correzione. Il manifest dell'app trascura di includere lo spazio dei nomi "android:" nel suo tag minSdkVersion e quindi non si registra. L'aggiunta dello spazio dei nomi risolve un errore con la barra delle azioni non trovata. Sciatto, Google!
Nick,

In realtà potrebbe essere necessario specificare targetSdkVersion. È possibile eseguire con un minSdkVersion inferiore se si utilizza la libreria compat, ma targetSdkVersion determina il comportamento.
William,

Grande!! questo è quello che stavo cercando.
swiftBoy,

<usi-sdk android: minSdkVersion = "11" /> risolto il mio problema grazie
Majid

27

ActionBar ha bisogno del tema dell'applicazione o dell'attività per avere un titolo app. Assicurati di non aver definito l'applicazione o l'attività come 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;

poi

extends AppCompatActivity

quindi utilizzare

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

risolve il mio problema nell'esempio del cassetto di navigazione di google.
Weishi Zeng

Buona soluzione, ma per coloro che la implementeranno molto probabilmente otterranno errori basati sulla compatibilità. Se ti capita di farlo, assicurati di controllare le tue importazioni in android.support.v4.app.FragmentTransaction anziché solo android.app.FragmentTransaction e android.support.v7.app.ActionBar invece di android.app.ActionBar
Serj Ardovic

18

Questa risposta è in ritardo ma potrebbe essere utile a chiunque arrivi da Google: potrebbe essere necessario dichiararlo

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

nel tuo styles.xml. Sembra che falsepossa essere l'impostazione predefinita. Devi anche essere su API 11 o successiva.

Maggiori dettagli sono disponibili nella documentazione qui . In particolare, citare:

Suggerimento: se hai un tema di attività personalizzato in cui desideri rimuovere la barra delle azioni, imposta la proprietà di stile android: windowActionBar su false. Tuttavia, se si rimuove la barra delle azioni utilizzando un tema, la finestra non consentirà affatto la barra delle azioni, quindi non è possibile aggiungerla in un secondo momento: la chiamata a getActionBar () restituirà null.


11

Ho avuto lo stesso problema e una delle soluzioni era quella di utilizzare setContentView()prima di chiamare getActionBar().

Ma c'era un'altra cosa che ha risolto il problema. Ho specificato il tema per l'applicazione @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>

Penso che qualsiasi tema, che ha <item name="android:windowActionBar">true</item>in esso, può essere utilizzato.


Grazie, funziona per me. Nel mio caso, anche il metodo getActionBar () ha restituito null e ho potuto risolverlo cambiando lo stile del tema in Theme.Holo.Light. Con alcuni altri temi (ad esempio Theme.AppCompat), sembra che ActionBar non sia attivo, quindi il suo valore è nullo.
Harrakiss,

10

Il motivo principale è l'utilizzo di temi che non supportano ActionBar:

Nel file manifest aggiungere quanto segue nell'attività di destinazione o nell'elemento dell'applicazione (se si desidera unificare il tema sull'intera applicazione)

Esempi di temi che supportano la barra delle azioni "Theme.AppCompat.Light"o "Theme.Holo.Light"...

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

È meglio inserire tutti gli stili styles.xmle usarli ovunque usando "@style/themName"così sarà quello precedente

android:theme="@style/AppTheme"

e styles.xml avrà il seguente:

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

suggerimenti:

  • Esistono alcuni temi che non possono essere utilizzati nei vecchi SDK come "@android:style/Theme.Holo.Light.DarkActionBar"non supportati prima della versione 14 degli SDK.
  • Per consentire alla tua app di supportare la versione specifica minima dell'SDK è possibile aggiungere l' <app>elemento seguente :

    <uses-sdk android:minSdkVersion="14" />
  • Per specificare la versione minima dell'SDK in AndroidStudio, è possibile utilizzare il file Gradle dell'app.

    android{
      defaultConfig{
        minSdkVersion 14
        targetSdkVersion 21
      }
    }

ma cosa devo fare per supportare il livello API 9-13, nel caso in cui utilizzo Theme.Holo.Light.DarkActionBar
Sid

8

Ho riscontrato questo problema. Stavo verificando il numero di versione e abilitando la barra delle azioni solo se era maggiore o uguale a Honeycomb, ma restituiva null. Ho trovato la ragione e la causa principale era che avevo disabilitato lo stile Tema Holo in style.xml nella cartella valori-v11.


Ho risolto il mio problema usando Holo Theme come tema principale del mio AppTheme.
Bharat Dodeja,

7

vai su AndroidManifest.xml e sostituisci

android: theme = "@ stile / AppTheme"

by 

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



4

Nel mio caso, avevo questo nel mio codice che non funzionava:

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

    requestWindowFeature(Window.FEATURE_ACTION_BAR);

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
}

Quindi ho giocato con l'ordine del codice:

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

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    context = getApplicationContext();
}

E ha funzionato!

Conclusione: requestWindowFeature dovrebbe essere la prima cosa che chiami nel metodo onCreate.


3

Ho avuto lo stesso problema. Risolto modificando il tema dell'app in styles.xml

Prima

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

Dopo

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

2

Una cosa che volevo aggiungere da quando mi ero appena imbattuto in questo, se stai cercando di ottenere ActionBar () su un'attività che ha un genitore, restituirà null. Sto cercando di refactificare il codice in cui è contenuta la mia attività all'interno di un gruppo di attività e mi ci sono voluti alcuni minuti per passare a "oh duh" dopo aver esaminato l'origine di come viene creato un ActionBar nel sorgente.


potresti pubblicare la tua soluzione per gruppi di attività?
Anthea,

La mia soluzione da ciò che ricordo è che ho refactored il mio codice per non utilizzare alcun ActivityGroups. Spiacenti, non ho frammenti di codice :(
C Nick,

Questa non è in realtà una soluzione; più di un commento. Ma molto utile!
Kato,

1

Lo risolvo con questi cambiamenti:

  1. cambiamento in minifest android:theme="@android:style/Theme.Holo.Light" >
  2. aggiungi alla classe extends ActionBarActivity
  3. aggiungi importazione alla classe import android.support.v7.app.ActionBarActivity

1

Per aggiungere alle altre risposte:

Assicurati di chiamare setActionBar()o setSupportActionBar()nel tuo onCreate()metodo prima di chiamare ilgetActionBar() :

Definisci alcune barre degli strumenti in activity.xml, quindi in onCreate ():

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

0

So di essere in ritardo alla festa (e non conoscendo Android) su questa domanda, ma ho trovato le informazioni qui molto utili e ho pensato che avrei dovuto aggiungere i risultati dei miei sforzi per far funzionare ActionBar come volevo nel caso in cui venissero altri come me in cerca di aiuto.

Ho un widget che è una finestra mobile senza titolo di finestra. Uso un tema di stile per implementare android:windowIsFloating, android:backgroundDimEnabledeandroid:windowNoTitle . Il widget ha funzionato bene fino a quando non ho voluto aggiungere un pulsante che chiamava un pager di frammenti con diverse pagine di frammenti di elenco e utilizzava ActionBar. Si arresterebbe in modo anomalo sull'attività del cercapersone con un'eccezione puntatore null. L'ho ristretto a ActionBar essendo null. Seguendo i risultati delle persone precedenti che hanno contribuito a questo thread, ho rimosso il mio tema dal file manifest e ActionBar ha funzionato bene, ma ora la mia finestra ora era più mobile (era a schermo intero) e aveva un titolo di pagina che non volevo.

Ulteriori ricerche mi hanno portato alla Guida alla formazione sull'API di stili e temi che mi ha portato a una soluzione. Ho scoperto di poter aggiungere il mio tema personalizzato alle singole attività nel file manifest mentre prima lo stavo applicando all'applicazione. Tutte le mie finestre ora hanno l'aspetto desiderato.


0

Prova ad estendere la tua classe Activity da ActionBarActivity. Questo mi ha risolto. Fai qualcosa di simile al seguente:

public class MyActivity extends ActionBarActivity
{
  . . .

Nel mio caso la classe si stava estendendo solo dall'attività.


0

Questo può anche aiutare alcune persone.

Nel mio caso, è stato perché non avevo definito un contesto nel menu.xml

Prova questo:

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

Invece di questo:

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

0

Basta controllare l'implementazione del codice sorgente facendo clic sul 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); Risolto il problema quando vedevo requestWindowFeature (Window.FEATURE_ACTION_BAR) non riuscita; il codice è open source usalo !!


0

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

funziona abbastanza rapidamente


3
Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo riguardo a come e / o perché risolve il problema migliorerebbe il valore a lungo termine della risposta.
Nic3500,

0

Nel mio caso ho dovuto semplicemente estendere AppCompatActivityanzichéActivity

    supportActionBar?.setDisplayHomeAsUpEnabled(true)

Classe di esempio di attività 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)
    } }

Versioni

    minSdkVersion 22
    targetSdkVersion 29
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.