getActionBar () retorna nulo


176

Estou tendo um problema estranho. Estou criando um aplicativo com o targetdk 13.

No método onCreate da minha atividade principal, eu chamo getActionBar() para configurar minha barra de ação. Isso funciona bem quando executado no emulador do Android 3.2, mas ao usar o Android 3.0 e 3.1, o getActionBar()método retorna nulo.

Acho isso extremamente estranho, e não vejo nenhuma razão para isso. Isso é um erro dos emuladores ou há algo que preciso fazer para garantir que meu aplicativo tenha uma barra de ação?

SOLUÇÃO: Acho que encontrei uma solução para esse problema. Eu não estava usando o setContentView para definir um layout para a atividade. Em vez disso, eu estava usando fragmentTransaction.add(android.R.id.content, mFragment, mTag)para adicionar um fragmento à atividade. Isso funcionou bem no 3.2, mas nas versões anteriores do honeycomb a barra de ação aparentemente não está definida se você não usar o setContentView no onCreate()método Então eu o corrigi usando o setContentView()método no meuonCreate() corrigi método e fornecendo apenas um layout que continha um FrameLayout vazio. Ainda posso usar o fragmentTransaction.add(android.R.id.content, mFragment, mTag)método da mesma maneira que antes.

Não é a solução mais bonita, mas funciona.


como você apontou para responder a outra postagem, você precisa de um tema Holo. Não suponha que você especificou seu tema holo apenas em uma pasta v13 res? Desculpe se isso parece óbvio demais.
PJL 29/07

Não, esse foi meu primeiro pensamento também, mas esse não é o caso. Obrigado pela sua resposta.
Christian Skogsberg 29/07

Respostas:


226

Pode usar em getSupportActionBar()vez de getActionBar()método.


fora daqui tudo, fez isso por mim!
msysmilu

16
obrigado, eu estava usando "android.support.v7.app.ActionBarActivity", então isso foi feito para mim.
velval

1
Após 2 horas de pesquisa! Alterar para getSupportActionBar () e android.support.v7.app.ActionBarActivity finalmente corrige isso para mim.
FacePalm 26/10/2015

Esta é a solução para o problema.
zygimantus

46

Se você estiver usando a biblioteca de suporte

import android.support.v7.app.ActionBarActivity;

public class MainActivity extends ActionBarActivity {

use em getSupportActionBar()vez degetActionBar()

* Atualização:

A classe ActionBarActivity agora está obsoleta:

import android.support.v7.app.ActionBarActivity;

Eu recomendo usar:

import android.support.v7.app.AppCompatActivity

dentro android.support.v7.app: ActionBarActivityobsoleto Use android.support.v7.app.AppCompatActivityvez.
A. Petrov

35

É necessário definir o tipo de janela como barra de ação antes da atividade renderizar sua visualização.

usar

requestWindowFeature(Window.FEATURE_ACTION_BAR);

antes de chamar o método setContentView ().


Se getSupportActionBar () não funcionar, então este funciona como um encanto
Ashwin Balani

35
  1. se você estiver usando android.support.v7.app.AppCompatActivity

    classe pública HomeActivity estende AppCompatActivity {

Então você deve usar android.support.v7.app.ActionBar

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

    classe pública HomeActivity estende FragmentActivity {

então você deve usar android.app.ActionBar

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

    classe pública HomeActivity estende ActionBarActivity {

você deve estar usando android.support.v7.app.ActionBar

   ActionBar ab = getSupportActionBar();

Ótima resposta, resolve a confusão !!
sud007

31

Eu enfrentei o problema acima, onde o getActionBar()método retorna nulo. Eu estava ligando para o getActionBar()depois de definir o setContentView()e ainda está retornando umnull .

Resolvi o problema definindo a versão min-sdk no arquivo Android Manifest que estava ausente inicialmente. <uses-sdk android:minSdkVersion="11" />


4
Isso me salvou muito tempo! Qualquer pessoa que use o aplicativo de exemplo de bate-papo Bluetooth no Android SDK precisa usar essa correção. O manifesto do aplicativo não inclui o namespace "android:" em sua tag minSdkVersion e, portanto, não é registrado. A adição do espaço para nome corrige um erro com a barra de ação não sendo encontrada. Desleixado, Google!
29412 Nick

Na verdade, você pode precisar especificar targetSdkVersion. Você pode executar com um minSdkVersion mais baixo se estiver usando a biblioteca compat, mas targetSdkVersion determina o comportamento.
William

Ótimo!! era isso que eu estava procurando.
swiftBoy

<usos-SDK do Android: minSdkVersion = "11" /> resolvido meu problema graças
Majid

27

O ActionBar precisa do Tema do aplicativo ou atividade para ter um título de aplicativo. Verifique se você não denominou seu aplicativo ou atividade 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;

então

extends AppCompatActivity

então use

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

corrige meu problema no exemplo da gaveta de navegação do google.
Weishi Zeng

Boa solução, mas para quem vai implementá-lo provavelmente obterá erros baseados em compatibilidade. Se você fizer isso, verifique suas importações em android.support.v4.app.FragmentTransaction em vez de apenas android.app.FragmentTransaction e android.support.v7.app.ActionBar em vez de android.app.ActionBar
Serj Ardovic 11/11/17

18

Esta resposta está atrasada, mas pode ser útil para quem chega do Google: pode ser necessário declarar

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

no seu styles.xml. Parecefalse pode ser o padrão. Você também precisa estar na API 11 ou superior.

Mais detalhes podem ser encontrados na documentação aqui . Especificamente, citação:

Dica: Se você tem um tema de atividade personalizado no qual deseja remover a barra de ação, defina a propriedade android: windowActionBar style como false. No entanto, se você remover a barra de ação usando um tema, a janela não permitirá a barra de ação, portanto você não poderá adicioná-la mais tarde - chamar getActionBar () retornará nulo.


11

Eu tinha o mesmo problema e uma das soluções era usar setContentView()antes de ligar getActionBar().

Mas havia outra coisa que resolveu o problema. Especifiquei o tema para o aplicativo @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>

Eu acho que qualquer tema, que contém <item name="android:windowActionBar">true</item>, pode ser usado.


Obrigado, funciona para mim. No meu caso, o método getActionBar () também retornou nulo e eu resolvi alterando o estilo do tema para Theme.Holo.Light. Com alguns outros temas (por exemplo, Theme.AppCompat), parece que o ActionBar não está ativo, portanto seu valor é nulo.
harrakiss

10

O principal motivo disso é o uso de temas que não oferecem suporte ao ActionBar:

No arquivo de manifesto, adicione o seguinte na atividade de destino ou no elemento do aplicativo (se você deseja unificar o tema em todo o aplicativo)

Exemplos de temas que suportam barra de ação "Theme.AppCompat.Light"ou "Theme.Holo.Light"...

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

É melhor colocar todos os estilos styles.xmle usá-los em qualquer lugar, "@style/themName"para que o anterior seja

android:theme="@style/AppTheme"

e styles.xml terão o seguinte:

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

Dicas:

  • Existem alguns temas que não podem ser usados ​​em SDKs antigos, como "@android:style/Theme.Holo.Light.DarkActionBar"não são suportados antes da versão 14 do SDKs.
  • Para permitir que seu aplicativo ofereça suporte à versão específica mínima do SDK, você pode adicionar o seguinte no <app>elemento:

    <uses-sdk android:minSdkVersion="14" />
  • Para especificar a versão mínima do SDK no AndroidStudio, você pode usar o arquivo Gradle do aplicativo.

    android{
      defaultConfig{
        minSdkVersion 14
        targetSdkVersion 21
      }
    }

mas o que eu faço para suporte de nível API 9-13, meter eu uso Theme.Holo.Light.DarkActionBar
Sid

8

Eu encontrei este problema. Eu estava checando o número da versão e ativando a barra de ação apenas se for maior ou igual ao Honeycomb, mas estava retornando nulo. Descobri o motivo e a causa raiz: desabilitei o estilo Tema Holo em style.xml na pasta values-v11.


Eu resolvi meu problema usando o Holo Theme como tema principal do meu AppTheme.
Bharat Dodeja 19/03/2015

7

acesse o AndroidManifest.xml e substitua

android: theme = "@ style / AppTheme"

by 

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



4

No meu caso, eu tinha isso no meu código que não funcionava:

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

    requestWindowFeature(Window.FEATURE_ACTION_BAR);

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
}

Então eu brinquei com a ordem do código:

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

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    context = getApplicationContext();
}

E funcionou!

Conclusão: requestWindowFeature deve ser a primeira coisa que você chama no método onCreate.


3

Eu tive o mesmo problema. Ele foi resolvido perseguindo o tema do aplicativo em styles.xml

Antes

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

Depois de

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

2

Uma coisa que eu gostaria de adicionar desde que acabei de descobrir isso, se você estiver tentando obter getActionBar () em uma atividade que tenha um pai, ele retornará nulo. Estou tentando refatorar o código onde minha Atividade está contida em um ActivityGroup, e demorou alguns minutos para que eu seguisse "oh duh" depois de examinar a fonte de como um ActionBar é criado na fonte.


você poderia postar sua solução para grupos de atividades?
Anthea

Minha solução, pelo que me lembro, foi refatorar meu código para não usar nenhum ActivityGroups. Desculpe eu não tenho trechos de código :(
C Nick

Isso não é realmente uma solução; mais um comentário. Mas muito útil!
Kato

1

Eu resolvo isso com essas alterações:

  1. mudança no minifest android:theme="@android:style/Theme.Holo.Light" >
  2. adicionar à classe extends ActionBarActivity
  3. adicionar importação à classe import android.support.v7.app.ActionBarActivity

1

Para adicionar às outras respostas:

Certifique-se de ligar setActionBar()ou setSupportActionBar()usar seu onCreate()método antes de chamar ogetActionBar() :

Defina alguma barra de ferramentas no seu activity.xml e, em seguida, no onCreate ():

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

0

Sei que estou atrasado para a festa (e sou novo no Android) sobre essa questão, mas achei as informações aqui muito úteis e achei que deveria adicionar as descobertas de meus próprios esforços ao fazer com que o ActionBar funcionasse como eu queria, caso outros como eu viessem. procurando ajuda.

Eu tenho um widget que é uma janela flutuante sem título de janela. Eu uso um tema estilo de implementar android:windowIsFloating, android:backgroundDimEnabledeandroid:windowNoTitle . O widget funcionou bem até que eu quisesse adicionar um botão que chamasse um pager de fragmentos com várias páginas de fragmentos de lista e usasse o ActionBar. Falhava na atividade do pager com uma exceção de ponteiro nulo. Limitei-o ao ActionBar sendo nulo. Após as descobertas de pessoas anteriores que contribuíram para esse tópico, removi meu tema do arquivo de manifesto e o ActionBar funcionou bem, mas agora minha janela flutuava mais (era em tela cheia) e tinha um título de página que eu não queria.

Mais pesquisas me levaram ao Guia de treinamento da API de estilos e temas, que me levou a uma solução. Descobri que podia adicionar meu tema personalizado a atividades individuais no arquivo de manifesto, enquanto antes de aplicá-lo ao aplicativo. Todas as minhas janelas agora têm a aparência desejada.


0

Tente estender sua classe Activity de ActionBarActivity. Isso resolveu para mim. Faça algo como o seguinte:

public class MyActivity extends ActionBarActivity
{
  . . .

No meu caso, a classe estava se estendendo apenas a partir de Activity.


0

Isso também pode ajudar algumas pessoas.

No meu caso, foi porque eu não havia definido um contexto no menu.xml

Tente o seguinte:

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

Em vez disso:

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

0

Basta verificar a implementação do código-fonte clicando no 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); Corrigido meu problema quando vi requestWindowFeature (Window.FEATURE_ACTION_BAR) está falhando; código é open source use-o !!


0

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

funciona muito rapidamente


3
Embora esse código possa responder à pergunta, fornecer um contexto adicional sobre como e / ou por que resolve o problema melhoraria o valor a longo prazo da resposta.
precisa saber é o seguinte

0

No meu caso, eu simplesmente tive que estender em AppCompatActivityvez deActivity

    supportActionBar?.setDisplayHomeAsUpEnabled(true)

Classe de exemplo de atividade completa:

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

Em versões

    minSdkVersion 22
    targetSdkVersion 29
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.