getActionBar () gibt null zurück


176

Ich habe ein seltsames Problem. Ich mache eine App mit targetdk 13.

In der onCreate-Methode meiner Hauptaktivität rufe ich auf, getActionBar()um meine Aktionsleiste einzurichten. Dies funktioniert gut, wenn es auf dem Android 3.2-Emulator ausgeführt wird. Bei Verwendung von Android 3.0 und 3.1 gibt die getActionBar()Methode jedoch null zurück.

Ich finde das extrem seltsam und kann keinen Grund erkennen, warum es so wäre. Ist dies ein Fehler mit den Emulatoren oder muss ich etwas tun, um sicherzustellen, dass meine Anwendung über eine Aktionsleiste verfügt?

LÖSUNG: Ich glaube, ich habe eine Lösung für dieses Problem gefunden. Ich habe setContentView nicht verwendet, um ein Layout für die Aktivität festzulegen. Stattdessen habe ich fragmentTransaction.add(android.R.id.content, mFragment, mTag)der Aktivität ein Fragment hinzugefügt. Dies hat in 3.2 gut funktioniert, aber in früheren Wabenversionen ist die Aktionsleiste anscheinend nicht festgelegt, wenn Sie setContentView nicht in der onCreate()Methode verwenden. Also habe ich es behoben, indem ich die setContentView()Methode in meiner onCreate()Methode verwendet und sie nur mit einem Layout versehen habe, das ein leeres FrameLayout enthielt. Ich kann die fragmentTransaction.add(android.R.id.content, mFragment, mTag)Methode immer noch genauso verwenden wie zuvor.

Es ist nicht die schönste Lösung, aber es funktioniert.


Wie Sie bei der Beantwortung eines anderen Beitrags angedeutet haben, benötigen Sie ein Holo-Thema. Angenommen, Sie haben Ihr Holo-Thema nur in einem v13 res-Ordner angegeben? Entschuldigung, wenn das zu offensichtlich klingt.
PJL

Nein, das war auch mein erster Gedanke, aber das ist nicht der Fall. Vielen Dank für Ihre Antwort.
Christian Skogsberg

Antworten:


225

Kann getSupportActionBar()anstelle der getActionBar()Methode verwenden.


von allem von hier aus hat das alles für mich getan!
Msysmilu

16
danke, ich habe "android.support.v7.app.ActionBarActivity" verwendet, also hat dies für mich getan.
Velval

1
Nach 2 Stunden Suche! Das Ändern von getSupportActionBar () und android.support.v7.app.ActionBarActivity behebt es schließlich für mich.
FacePalm

Dies ist die Lösung des Problems.
Zygimantus

46

Wenn Sie die Support-Bibliothek verwenden

import android.support.v7.app.ActionBarActivity;

public class MainActivity extends ActionBarActivity {

verwenden getSupportActionBar()stattgetActionBar()

* Update:

Die Klasse ActionBarActivity ist jetzt veraltet:

import android.support.v7.app.ActionBarActivity;

Ich empfehle zu verwenden:

import android.support.v7.app.AppCompatActivity

innerhalb android.support.v7.app: ActionBarActivityveraltet Verwenden Sie android.support.v7.app.AppCompatActivitystattdessen.
A. Petrov

35

Sie müssen den Fenstertyp als Aktionsleiste definieren, bevor die Aktivität ihre Ansicht rendert.

verwenden

requestWindowFeature(Window.FEATURE_ACTION_BAR);

vor dem Aufruf der Methode setContentView ().


Wenn getSupportActionBar () nicht funktioniert, funktioniert dies wie ein Zauber
Ashwin Balani

35
  1. Wenn Sie android.support.v7.app.AppCompatActivity verwenden

    öffentliche Klasse HomeActivity erweitert AppCompatActivity {

Dann sollten Sie android.support.v7.app.ActionBar verwenden

  ActionBar ab = getSupportActionBar();
  1. Wenn Sie android.support.v4.app.FragmentActivity verwenden

    öffentliche Klasse HomeActivity erweitert FragmentActivity {

dann sollten Sie android.app.ActionBar verwenden

    ActionBar ab = getActionBar();
  1. Wenn Sie android.support.v7.app.ActionBarActivity verwenden

    öffentliche Klasse HomeActivity erweitert ActionBarActivity {

Sie sollten android.support.v7.app.ActionBar verwenden

   ActionBar ab = getSupportActionBar();

Tolle Antwort, packt die Verwirrung an !!
Sud007

31

Ich war mit dem obigen Problem konfrontiert, bei dem die getActionBar()Methode null zurückgibt. Ich habe das angerufen, getActionBar()nachdem ich das eingestellt habe setContentView()und es immer noch zurückgegeben wird null.

Ich habe das Problem behoben, indem ich die min-sdk-Version in der Android Manifest-Datei festgelegt habe, die anfangs fehlte. <uses-sdk android:minSdkVersion="11" />


4
Das hat mir so viel Zeit gespart! Jeder, der die Bluetooth Chat-Beispiel-App im Android SDK verwendet, muss diesen Fix verwenden. Das Manifest der App vernachlässigt es, den Namespace "android:" in das minSdkVersion-Tag aufzunehmen, und registriert sich daher nicht. Durch Hinzufügen des Namespace wird ein Fehler behoben, bei dem die Aktionsleiste nicht gefunden wurde. Schlampig, Google!
Nick

Möglicherweise müssen Sie nur targetSdkVersion angeben. Sie können mit einer niedrigeren minSdkVersion ausgeführt werden, wenn Sie die kompatible Bibliothek verwenden, aber targetSdkVersion bestimmt das Verhalten.
William

Toll!! das habe ich gesucht.
SwiftBoy

<used-sdk android: minSdkVersion = "11" /> hat mein Problem gelöst, danke
Majid

27

ActionBar benötigt das Thema der Anwendung oder Aktivität, um einen App-Titel zu haben. Stellen Sie sicher, dass Sie Ihre Anwendung oder Aktivität nicht als Theme.NOTITLE gestaltet haben.

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

dann

extends AppCompatActivity

dann benutze

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

behebt mein Problem im Beispiel der Navigationsschublade von Google.
Weishi Zeng

Gute Lösung, aber für diejenigen, die sie implementieren, werden höchstwahrscheinlich Kompatibilitätsfehler auftreten. Wenn Sie dies tun, überprüfen Sie Ihre Importe sa android.support.v4.app.FragmentTransaction anstelle von nur android.app.FragmentTransaction und android.support.v7.app.ActionBar anstelle von android.app.ActionBar
Serj Ardovic

18

Diese Antwort ist spät, kann aber für jeden hilfreich sein, der von Google kommt: Möglicherweise müssen Sie dies deklarieren

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

in deinem styles.xml. Es scheint falsedie Standardeinstellung zu sein. Sie müssen außerdem API 11 oder höher verwenden.

Weitere Details finden Sie in der Dokumentation hier . Insbesondere zitieren:

Tipp: Wenn Sie ein benutzerdefiniertes Aktivitätsthema haben, in dem Sie die Aktionsleiste entfernen möchten, setzen Sie die Stileigenschaft android: windowActionBar auf false. Wenn Sie jedoch die Aktionsleiste mithilfe eines Themas entfernen, wird die Aktionsleiste im Fenster überhaupt nicht zugelassen, sodass Sie sie später nicht hinzufügen können. Wenn Sie getActionBar () aufrufen, wird null zurückgegeben.


11

Ich hatte das gleiche Problem und eine der Lösungen war, setContentView()vor dem Anruf zu verwenden getActionBar().

Aber es gab noch eine andere Sache, die das Problem behoben hat. Ich habe ein Thema für die Anwendung angegeben @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>

Ich denke, jedes Thema, das darin enthalten ist <item name="android:windowActionBar">true</item>, kann verwendet werden.


Danke, es funktioniert bei mir. In meinem Fall hat die Methode getActionBar () ebenfalls null zurückgegeben, und ich konnte das Problem beheben, indem ich den Designstil in Theme.Holo.Light änderte. Bei einigen anderen Themen (z. B. Theme.AppCompat) scheint die ActionBar nicht aktiv zu sein, daher ist ihr Wert null.
Harrakiss

10

Der Hauptgrund dafür ist die Verwendung von Themen, die ActionBar nicht unterstützen:

Fügen Sie in der Manifestdatei Folgendes entweder in Ihre Zielaktivität oder in Ihr Anwendungselement ein (wenn Sie das Thema über die gesamte Anwendung hinweg vereinheitlichen möchten).

Beispiele für Themen, die die Aktionsleiste unterstützen "Theme.AppCompat.Light"oder "Theme.Holo.Light"...

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

Es ist besser, alle Stile einzufügen styles.xmlund überall zu verwenden, "@style/themName"damit der vorherige verwendet wird

android:theme="@style/AppTheme"

und styles.xml haben Folgendes:

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

Hinweise:

  • Es gibt einige Themen, die in alten SDKs nicht verwendet werden können, wie "@android:style/Theme.Holo.Light.DarkActionBar"sie vor SDKs Version 14 nicht unterstützt werden.
  • Damit Ihre App eine bestimmte Mindestversion des SDK unterstützt, können Sie unter <app>Element Folgendes hinzufügen :

    <uses-sdk android:minSdkVersion="14" />
  • Um die minimale SDK-Version in AndroidStudio anzugeben, können Sie die Gradle-Datei der App verwenden.

    android{
      defaultConfig{
        minSdkVersion 14
        targetSdkVersion 21
      }
    }

aber was mache ich, um API Level 9-13 zu unterstützen, falls ich Theme.Holo.Light.DarkActionBar
Sid

8

Ich bin auf dieses Problem gestoßen. Ich habe nach der Versionsnummer gesucht und die Aktionsleiste nur aktiviert, wenn sie größer oder gleich Honeycomb ist, aber null zurückgegeben. Ich fand den Grund und die Hauptursache, dass ich den Holo-Theme-Stil in style.xml im Ordner values-v11 deaktiviert hatte.


Ich habe mein Problem behoben, indem ich Holo Theme als übergeordnetes Thema meines AppTheme verwendet habe.
Bharat Dodeja

7

Gehen Sie zur Datei AndroidManifest.xml und ersetzen Sie sie

android: theme = "@ style / AppTheme"

by 

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



4

In meinem Fall hatte ich dies in meinem Code, was nicht funktionierte:

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

    requestWindowFeature(Window.FEATURE_ACTION_BAR);

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
}

Dann habe ich mit der Reihenfolge des Codes gespielt:

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

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    context = getApplicationContext();
}

Und es hat funktioniert!

Schlussfolgerung: requestWindowFeature sollte das erste sein, was Sie in der onCreate-Methode aufrufen.


3

Ich hatte das gleiche Problem. Es wurde gelöst, indem das App-Thema in styles.xml geändert wurde

Vor

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

Nach dem

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

2

Eine Sache, die ich hinzufügen wollte, da ich gerade darauf gestoßen bin: Wenn Sie versuchen, ActionBar () für eine Aktivität mit einem übergeordneten Element abzurufen, wird null zurückgegeben. Ich versuche, Code umzugestalten, in dem meine Aktivität in einer ActivityGroup enthalten ist, und es dauerte einige Minuten, bis ich "oh duh" ging, nachdem ich mir die Quelle angesehen hatte, wie eine ActionBar in der Quelle erstellt wird.


Könnten Sie Ihre Lösung für Aktivitätsgruppen veröffentlichen?
Anthea

Soweit ich mich erinnere, habe ich meinen Code überarbeitet, um keine ActivityGroups zu verwenden. Entschuldigung, ich habe keine Code-Schnipsel :(
C Nick

Dies ist eigentlich keine Lösung; eher ein Kommentar. Aber sehr nützlich!
Kato

1

Ich löse es durch diese Änderungen:

  1. Veränderung im Leben android:theme="@android:style/Theme.Holo.Light" >
  2. zur Klasse hinzufügen extends ActionBarActivity
  3. Import zur Klasse hinzufügen import android.support.v7.app.ActionBarActivity

1

So ergänzen Sie die anderen Antworten:

Stellen Sie sicher, dass Sie setActionBar()oder setSupportActionBar()in Ihrer onCreate()Methode aufrufen, bevor Sie Folgendes aufrufen getActionBar():

Definieren Sie eine Symbolleiste in Ihrer activity.xml und dann in onCreate ():

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

0

Ich weiß, dass ich zu spät zur Party komme (und neu bei Android), aber ich fand die Informationen hier sehr hilfreich und dachte, ich sollte die Ergebnisse meiner eigenen Bemühungen hinzufügen, ActionBar so zu machen, wie ich es wollte, falls andere wie ich kommen Suche nach Hilfe.

Ich habe ein Widget, das ein schwebendes Fenster ohne Fenstertitel ist. Ich verwende ein Stilthema, um zu implementieren android:windowIsFloating, android:backgroundDimEnabledund android:windowNoTitle. Das Widget funktionierte einwandfrei, bis ich eine Schaltfläche hinzufügen wollte, die einen Fragment-Pager mit mehreren Listenfragment-Seiten aufrief und die ActionBar verwendete. Es würde bei der Pager-Aktivität mit einer Nullzeiger-Ausnahme abstürzen. Ich habe es auf die ActionBar eingegrenzt, die null ist. Nach den Erkenntnissen früherer Personen, die zu diesem Thread beigetragen haben, habe ich mein Thema aus der Manifestdatei entfernt und die ActionBar hat einwandfrei funktioniert, aber jetzt schwebte mein Fenster länger (es war Vollbild) und es hatte einen Seitentitel, den ich nicht wollte.

Weitere Nachforschungen führten mich zum API-Schulungshandbuch für Stile und Themen, das mich zu einer Lösung führte. Ich habe festgestellt, dass ich mein benutzerdefiniertes Thema zu einzelnen Aktivitäten in der Manifestdatei hinzufügen kann, bevor ich es auf die Anwendung angewendet habe. Alle meine Fenster haben jetzt das gewünschte Aussehen.


0

Versuchen Sie, Ihre Aktivitätsklasse von ActionBarActivity aus zu erweitern. Das hat es für mich gelöst. Gehen Sie wie folgt vor:

public class MyActivity extends ActionBarActivity
{
  . . .

In meinem Fall erstreckte sich die Klasse nur von Aktivität.


0

Dies kann auch einigen Menschen helfen.

In meinem Fall lag es daran, dass ich in der menu.xml keinen Kontext definiert hatte

Versuche dies:

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

An Stelle von:

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

0

Überprüfen Sie einfach die Implementierung des Quellcodes per Befehlsklick:

    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); Ich habe mein Problem behoben, als ich sah, dass requestWindowFeature (Window.FEATURE_ACTION_BAR) fehlschlägt. Code ist Open Source benutze es !!


0

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

funktioniert ziemlich schnell


3
Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern.
Nic3500

0

In meinem Fall musste ich einfach verlängern AppCompatActivitystattActivity

    supportActionBar?.setDisplayHomeAsUpEnabled(true)

Beispielklasse für vollständige Aktivität:

android.os.Bundle importieren androidx.appcompat.app.AppCompatActivity importieren

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

Auf Versionen

    minSdkVersion 22
    targetSdkVersion 29
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.