it-swarm.com.de

getActionBar () gibt null zurück

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

In meiner onCreate-Methode rufe ich getActionBar() auf, um meine Aktionsleiste einzurichten. Dies funktioniert problemlos, wenn Sie den Android 3.2-Emulator ausführen. Wenn Sie jedoch Android 3.0 und 3.1 verwenden, gibt die Methode getActionBar() den Wert null zurück.

Ich finde das extrem seltsam und ich kann keinen Grund dafür erkennen, warum dies so wäre ... Ist dies ein Fehler bei 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 die setContentView nicht verwendet, um ein Layout für die Aktivität festzulegen. Stattdessen habe ich fragmentTransaction.add(Android.R.id.content, mFragment, mTag) verwendet, um der Aktivität ein Fragment hinzuzufügen .. __ Dies funktionierte gut in 3.2, aber in früheren Wabenversionen wurde die Aktionsleiste anscheinend nicht gesetzt, wenn Sie die setContentView nicht in der onCreate() method . Also habe ich das Problem behoben, indem ich die setContentView() - Methode in meiner onCreate() - Methode verwendet habe und sie nur mit einem Layout versehen habe, das ein leeres FrameLayout enthielt fragmentTransaction.add(Android.R.id.content, mFragment, mTag) Methode wie zuvor.

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

169

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

208
Amir

Wenn Sie die Support-Bibliothek verwenden

import Android.support.v7.app.ActionBarActivity;

public class MainActivity extends ActionBarActivity {

verwenden Sie getSupportActionBar() anstelle von getActionBar()

* Update:

Die Klasse ActionBarActivity ist jetzt veraltet:

import Android.support.v7.app.ActionBarActivity;

Ich empfehle zu verwenden:

import Android.support.v7.app.AppCompatActivity
46
Elenasys

Sie müssen den Fenstertyp als Aktionsleiste definieren, bevor die Aktivität der Ansicht dargestellt wird.

benutzen 

requestWindowFeature(Window.FEATURE_ACTION_BAR);

vor dem Aufruf der setContentView () -Methode.

33
kaushal trivedi

Ich habe das obige Problem gesehen, bei dem die getActionBar()-Methode null zurückgibt. Ich rief die getActionBar() an, nachdem ich die setContentView() gesetzt hatte und immer noch eine null zurückgegeben hatte.

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

31
Rajendra
  1. wenn Sie Android.support.v7.app.AppCompatActivity verwenden  

    public class HomeActivity erweitert AppCompatActivity {

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

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

    public class HomeActivity erweitert FragmentActivity {

dann sollten Sie Android.app.ActionBar verwenden

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

    public class HomeActivity erweitert ActionBarActivity {

sie sollten Android.support.v7.app.ActionBar verwenden

   ActionBar ab = getSupportActionBar();
31
Hitesh Sahu

ActionBar benötigt das Design der Anwendung oder Aktivität, um einen App-Titel zu erhalten. 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" > 
27

Diese Antwort ist verspätet, kann jedoch für alle hilfreich sein, die von Google ankommen

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

in Ihrem styles.xml. Es scheint, dass false der Standard sein kann. Sie müssen sich auch auf API 11 oder höher befinden.

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

Tipp: Wenn Sie ein benutzerdefiniertes Aktivitätsthema haben, in dem Sie .__ entfernen möchten. Setzen Sie für die Aktionsleiste die Stileigenschaft Android: windowActionBar auf falsch. Wenn Sie jedoch die Aktionsleiste mit einem Design entfernen, wird die Fenster lässt die Aktionsleiste überhaupt nicht zu und kann daher nicht hinzugefügt werden später - Aufruf von getActionBar () gibt null zurück.

18
SK9
import Android.support.v7.app.AppCompatActivity;

dann

extends AppCompatActivity

dann benutze

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
18

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

Fügen Sie in der Manifestdatei Folgendes entweder in Ihrer Zielaktivität oder in Ihrem Anwendungselement hinzu (wenn Sie das Design über die gesamte Anwendung vereinheitlichen möchten)

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

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

Es ist besser, alle Stile in styles.xml zu platzieren und sie überall mit "@style/themName" zu verwenden, so dass der vorherige Stil verwendet wird 

Android:theme="@style/AppTheme"

und styles.xml hat Folgendes:

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

Hinweise: 

  • Es gibt einige Designs, die in alten SDKs nicht verwendet werden können, z. B. "@Android:style/Theme.Holo.Light.DarkActionBar" wird vor SDKs 14 nicht unterstützt.
  • Damit Ihre App die minimale Version des SDK unterstützt, können Sie Folgendes unter <app>-Element 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
      }
    }
    
10
msoliman

Ich hatte das gleiche Problem und eine der Lösungen bestand darin, setContentView() zu verwenden, bevor getActionBar() aufgerufen wurde.

Aber es gab noch eine andere Sache, die das Problem löste. Ich habe das Design für die Anwendung als @Android:style/Theme.Holo.Light angegeben.

<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 <item name="Android:windowActionBar">true</item> enthält, kann verwendet werden.

10
ntoskrnl

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

8
Pratap Singh

gehen Sie zur AndroidManifest.xml und ersetzen Sie sie

Android: theme = "@ style/AppTheme"

by 

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

7
NEERAJ GUPTA

Verwenden Sie getSupportActionBar () anstelle von getActionBar ().

5
sonal balekai

In meinem Fall hatte ich dies in meinem Code, der 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!

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

4
Simon

Ich hatte das gleiche Problem. Es wurde behoben, indem das App-Design 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">
3
jafarmlp

Eine Sache, die ich hinzufügen wollte, da ich gerade auf dieses Thema gestoßen bin. Wenn Sie versuchen, getActionBar () für eine Activity mit einem übergeordneten Element auszuführen, wird null zurückgegeben. Ich versuche, den Code umzuwandeln, in dem sich meine Aktivität in einer ActivityGroup befindet, und es dauerte ein paar Minuten, bis ich "oh duh" ging, nachdem ich mir die Quelle angesehen hatte, wie eine ActionBar in Source erzeugt wird.

2
C Nick

Ich löse es durch diese Änderungen:

  1. Änderung im Minifest Android:theme="@Android:style/Theme.Holo.Light" >
  2. zur Klasse hinzufügen extends ActionBarActivity
  3. import zur Klasse import Android.support.v7.app.ActionBarActivity hinzufügen
1

In meinem Fall musste ich einfach AppCompatActivity anstelle von Activity erweitern

    supportActionBar?.setDisplayHomeAsUpEnabled(true)

Vollständige Aktivitätsbeispielklasse:

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

Bei Versionen

    minSdkVersion 22
    targetSdkVersion 29
0
DaddyMoe

Dies kann auch einigen Menschen helfen.

In meinem Fall war es, weil 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
ElaGorilaki

Versuchen Sie, Ihre Activity-Klasse von ActionBarActivity zu erweitern. Das hat es für mich gelöst. Tun Sie etwas wie das Folgende:

public class MyActivity extends ActionBarActivity
{
  . . .

In meinem Fall erstreckte sich die Klasse nur von Activity.

0
Alyoshak

Zu den anderen Antworten hinzufügen:

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

Definieren Sie einige Symbolleisten 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
A-Sharabiani

Ich weiß, dass ich zu dieser Party spät dran bin (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 gestalten, wie ich wollte, falls andere wie ich kommen Suche nach Hilfe.

Ich habe ein Widget, das ein schwebendes Fenster ohne Fenstertitel ist. Ich benutze ein Stildesign, um Android:windowIsFloating, Android:backgroundDimEnabled und Android:windowNoTitle zu implementieren. Das Widget funktionierte einwandfrei, bis ich eine Schaltfläche hinzufügen wollte, die einen Fragment-Pager mit mehreren Listenfragmentseiten aufrief und die ActionBar verwendete. Es würde bei der Pageraktivität mit einer Nullzeigerausnahme abstürzen. Ich habe es auf die ActionBar eingegrenzt, die null ist. Nach den Erkenntnissen früherer Leute, die zu diesem Thread beigetragen haben, entfernte ich mein Thema aus der Manifestdatei und die ActionBar funktionierte einwandfrei, aber jetzt schwebte mein Fenster nun länger (es war Vollbild) und es hatte einen Seitentitel, den ich nicht wollte.

Weitere Nachforschungen führten mich zum Styles and Themes API Training Guide , der mich zu einer Lösung führte. Ich stellte fest, dass ich mein individuelles Design zu den einzelnen Aktivitäten in der Manifestdatei hinzufügen konnte, während ich es vor der Anwendung auf die Anwendung anwendete. Alle meine Fenster haben jetzt das gewünschte Aussehen.

0
DocM

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

funktioniert ziemlich schnell

0
Akhila Madari

Überprüfen Sie einfach die Implementierung des Quellcodes mit dem 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); Mein Problem wurde behoben, als ich sah, dass requestWindowFeature (Window.FEATURE_ACTION_BAR) fehlschlug. Code ist Open Source verwenden Sie es!

0
Ankish Jain