Erro do Android [tentativa de invocar o método virtual 'void android.app.ActionBar' em uma referência de objeto nulo]

97

Eu tenho um módulo de código que implementa viewpager com gaveta de navegação, no entanto, quando executo o código, recebo o seguinte erro

01-26 09:20:02.958: D/AndroidRuntime(18779): Shutting down VM
01-26 09:20:02.959: E/AndroidRuntime(18779): FATAL EXCEPTION: main
01-26 09:20:02.959: E/AndroidRuntime(18779): Process: com.example.tabwithslidingdrawer, PID: 18779
01-26 09:20:02.959: E/AndroidRuntime(18779): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.tabwithslidingdrawer/com.example.tabwithslidingdrawer.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)' on a null object reference
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2314)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2388)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.ActivityThread.access$800(ActivityThread.java:148)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.os.Handler.dispatchMessage(Handler.java:102)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.os.Looper.loop(Looper.java:135)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.ActivityThread.main(ActivityThread.java:5312)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at java.lang.reflect.Method.invoke(Native Method)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at java.lang.reflect.Method.invoke(Method.java:372)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
01-26 09:20:02.959: E/AndroidRuntime(18779): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)' on a null object reference
01-26 09:20:02.959: E/AndroidRuntime(18779):    at com.example.tabwithslidingdrawer.MainActivity.onCreate(MainActivity.java:95)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.Activity.performCreate(Activity.java:5953)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1128)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2267)
01-26 09:20:02.959: E/AndroidRuntime(18779):    ... 10 more
09:20:02.959: E/AndroidRuntime(18779): Caused by:
java.lang.NullPointerException: Attempt to invoke virtual method 'void
android.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)' on a null
object reference 01-26 09:20:02.959: E/AndroidRuntime(18779):     at
com.example.tabwithslidingdrawer.MainActivity.onCreate(MainActivity.java:95)

aponta para esta linha

// enabling action bar app icon and behaving it as a toggle button
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

código inteiro http://pastebin.com/u1K72fr7

Meu manifesto

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.tabwithslidingdrawer"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.Tabwithpager" >
        <activity
            android:name="com.example.tabwithslidingdrawer.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

android: theme = "@ style / Theme.Tabwithpager"

código http://pastebin.com/EFQLzRej

========================================================== ================ EDITAR / ATUALIZAR:

O que eu aprendi com isso

Sempre que tal erro ocorre

1. Verifique que tipo de Activity está sendo usado, é uma simples atividade android.app ou AppCompatActivity ou ActionBarActivity e assim por diante.

2. Verifique se o seu tipo de atividade estendida se enquadra na categoria de compatibilidade

exemplo de atividade / fragmento baseado em android.app não são tipos appCompat, enquanto android.support.v4.app.Fragment ou android.support.v4.app.ActivityCompat são baseados em appCompat

se cair em appCompat, usamos getSupportActionBar (), caso contrário, para tipos de android.app podemos usar getActionBar ()

3. Verifique o tema aplicado à atividade em questão no arquivo de manifesto

exemplo: No arquivo de manifesto, se o tema aplicado for, digamos, android: theme = "@ android: style / Theme.Holo.Dialog" getActionBar () funcionará

mas se o tema aplicado para a atividade no manifesto for o seguinte android: theme = "@ style / Theme.AppCompat.Light", você terá que usar getSupportActionBar ()

ViVekH
fonte
3
você tenta getSupportActionbar()?
Kingfisher Phuoc
estou usando getSupportActionbar já em meu código
ViVekH
Você usou o tema compatível do aplicativo? Você deve postar seu Manifesto com sua declaração de atividade aqui para obter mais ajuda.
Kingfisher Phuoc
você deve examinar seu código novamente. Eu consigo supportActionBar(não nulo) com o seu tema. Você substituiu tudo getActionBarpor getSupportActionBar? Mais 1 coisa, você deve atualizar seu novo log de erros.
Kingfisher Phuoc
1
Eu olhei seu código. Na verdade, você ainda usa getActionBar()no seu MainActivity... Verifique e mude para getSupportActionBar.
Kingfisher Phuoc

Respostas:

151

Seu código está gerando com.example.tabwithslidingdrawer.MainActivity.onCreate(MainActivity.java:95):

        // enabling action bar app icon and behaving it as toggle button
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

O problema é muito simples - você Activityestá herdando do novo android.support.v7.app.ActionBarActivity. Você deve usar uma chamada para em getSupportActionBar()vez de getActionBar().

Se você olhar acima da linha 65 do seu código, verá que já está fazendo isso:

        actionBar = getSupportActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
        // TODO: Remove the redundant calls to getSupportActionBar()
        //       and use variable actionBar instead
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);

E então, mais abaixo em torno da linha 87, parece que você descobriu o mesmo:

        getSupportActionBar().setTitle(
                        Html.fromHtml("<font color=\"black\">" + mTitle + " - "
                                        + menutitles[0] + "</font>"));
        // getActionBar().setTitle(mTitle +menutitles[0]);

Observe como você comentou getActionBar().

Funktional
fonte
8
Apenas uma observação: android.support.v7.app.ActionBarActivityfoi substituído por android.support.v7.app.AppCompatActivity. Mas o problema é o mesmo.
Funktional de
1
Dentro de um fragmento, veja aqui
jacktrades
29

Se alguém quiser usar android.app.ActionBar e android.app.Activity, você deve alterar o tema do aplicativo em styles.xml , por exemplo:

<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">

O problema é que você pode estar usando um tema AppCompat .

Por outro lado, se você deseja usar android.support.v7.app.ActionBar e estende sua atividade com AppCompatActivity , você deve usar um tema AppCompat para evitar esse problema, por exemplo:

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

Espero que isto ajude.

crubio
fonte
Você também pode estender de em AppCompatActivityvez de Activity, como nesta resposta .
Keith de
Claro @Keith, se você quiser usar um tema AppCompat, você deve usar uma AppCompatActivity, caso contrário, você terá o mesmo problema de incompatibilidade.
crubio
Obrigado @crubio!
Kumaresh Babu NS de
18

quando você estende appcompatActivity , use

this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);

e quando você estender ActionBar , use

this.getActionBar().setDisplayHomeAsUpEnabled(true);

não se esqueça de chamar esta função no oncreate após inicializar a barra de ferramentas / barra de ação

Fazal
fonte
12

Acho que o que você quer fazer é lançar getActivity (). Por exemplo:

((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Isso é o que você precisa fazer com as novas bibliotecas de suporte. AppCompatActivity substituiu ActionBarActivity.

ronwill06
fonte
7

Tente verificar aqui

res >> valores >> styles.xml

certifique-se de que não há nenhum código como este

<item name="windowActionBar">false</item>

se houver código como esse, você pode desabilitar por um tempo ou apagá-lo

Febrianto Nugroho
fonte
Agradeço por me lembrar!! : DI também deixou <item name="windowNoTitle">true</item>, que teve que ser removido.
gujci
Para mim, o que funcionou foi retirar android:theme="@style/AppTheme.NoActionBar"da <avticity>tag do AndroidManifest.xml
Smaily Carrilho
4

Quando usar AppCompatActivity deve chamar

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

Antes getSupportActionBar()

public class PageActivity extends AppCompatActivity {
     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_item);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        this.getSupportActionBar().setDisplayHomeAsUpEnabled(false);

    }
}
Ahmad Aghazadeh
fonte
2

O botão para cima geralmente é ativado para atividades de baixo nível. No seu manifesto, vejo apenas a MainActivity. Não acho que faça sentido ativar o botão para cima para a atividade principal. Crie uma atividade e, em seguida, no manifesto, adicione o atributo parentActivityName. Em seguida, ative o botão para cima no método onCreate da atividade.
Isso deve ajudar.
https://developer.android.com/training/appbar/up-action.html

kiiya-natz
fonte
2

No meu caso, é por causa de styles.xmldefinir o tema pai errado, ou seja, o tema, NoActionBarclaro, getSupportActionbar()é nulo:

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

Alterado para outra coisa consertada:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
Fruta
fonte
2

Tente isto espero que funcione, meu código está funcionando bem

Toolbar toolbar = findViewById(R.id.toolbar1);
setSupportActionBar(toolbar);

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setTitle("");
Monzur
fonte
1

nesta linha em sua atividade:

super.onCreate(savedInstanceState);
setContentView(R.layout.Activity_Main);

usa isto:

super.onCreate(savedInstanceState);
setContentView(R.layout.*);

* é sua atividade

Soran
fonte
1

No meu caso, tive o mesmo erro, mas meu erro foi não ter declarado minha barra de ferramentas.

Portanto, antes de usar getSupportActionBar, tive que encontrar minha barra de ferramentas e definir a actionBar

    appbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(appbar);

    getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_nav_menu);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Jorge Casariego
fonte
1

Eu sei que essa pergunta é algo antigo. Mas isso pode ajudar muitos que apresentam esse problema.

Para resolver este problema, verifique se existe um ponto de nulidade. Em seguida, aplique a configuração correspondente:

if(getSupportActionBar() != null){
 getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 getSupportActionBar().setHomeButtonEnabled(true);
}
Quimbo
fonte
1

Se você estiver usando android.app.ActionBar e android.app.Activity, você deve alterar o tema do aplicativo na tag do aplicativo:

< application
     android:theme="@android:style/Theme.Holo.Light">
Hasan Jamshaid
fonte
1

Se você encontrar este erro

"java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.appcompat.app.ActionBar.setTitle (java.lang.CharSequence)' on a null object reference. "

Apenas use

setSupportActionBar (toolbar). 
kzncrda
fonte
0

Para qualquer outra pessoa que tenha uma BaseActivity e um filho que se estenda a partir dela, certifique-se de que super.onCreate () seja chamado antes de fazer qualquer coisa. A antiga Activity funcionaria se você chamasse super.onCreate () depois.

Criança estende atividade - pode ligar para super depois que você fizer alguma coisa

@Override
protected void onCreate(Bundle savedInstanceState)
{
    getActionBar().setDisplayHomeAsUpEnabled(true);
    super.onCreate(savedInstanceState);

Child estende AppCompatActivity - você tem que chamar super primeiro

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState); //do this first
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
1mike12
fonte
0

Para aqueles que ainda têm esse problema, meu problema foi resolvido no arquivo AndroidManifest.xml. Onde está escrito <activity android:name=".MainActivity" android:theme="@style/AppTheme.NoActionBar">, você precisa remover NoActionBar, fazendo isso <activity android:name=".MainActivity" android:theme="@style/AppTheme">, porque com NoActionBar definido o aplicativo não sabe se quer ou não uma barra de ação quando você chama uma dentro de MainActivity.java

Evan H.
fonte
0

Recebi o mesmo erro uma vez, criei um modelo para uma barra de ferramentas padrão (toolbar.xml) e, em outra visualização, criei uma barra de ferramentas que pode ser recolhida.

Eu pedi para adicionar a barra de ferramentas recolhível a uma visualização que mostrasse algumas informações do usuário (como o whatsapp), mas o método findViewById estava fazendo referência à barra de ferramentas padrão (barra de ferramentas id), não à que pode ser recolhida (barra de ferramentas id também) sim, eu escrevi a mesma id para ambas as barras de ferramentas, então quando tentei acessar a atividade o aplicativo travou mostrando o erro.

Corrigi o erro alterando o id da barra de ferramentas recolhível para id: col_toolbar e o erro desapareceu e meu aplicativo funcionou perfeitamente

Carlos fernando
fonte
0

Você deveria tentar este. Eu acho que vai funcionar.

    Toolbar toolbar = findViewById(R.id.toolbar1);
    setSupportActionBar(toolbar);

    mDrawerLayout = findViewById(R.id.drawer_layout);
    mDrawerLayout = findViewById(R.id.drawer_layout);
    mDrawerLayout.setDrawerShadow(R.drawable.rectagle_with_black_outer,
            GravityCompat.START);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
            toolbar, R.string.navigation_drawer_close,
            R.string.navigation_drawer_close) {
        public void onDrawerClosed(View view) {
            invalidateOptionsMenu();
        }

        public void onDrawerOpened(View drawerView) {
            invalidateOptionsMenu();
        }
    };
Itz Pkyadav
fonte
0

A melhor solução é fazer isso em seu método Oncreate

 ActionBar actionBar = getSupportActionBar();

        if(actionBar != null){
            actionBar.setDisplayHomeAsUpEnabled(true);
        }

seguido por uma nova classe

@Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();

        if(id == android.R.id.home){
            onBackPressed();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
Muyingo Steven
fonte
Embora este trecho de código possa responder à pergunta, incluir uma explicação de por que e como ele ajuda a resolver o problema melhora a qualidade e a longevidade de sua resposta. Veja como escrevo uma boa resposta?
ammportal
0

Por favor, adicione depois Toolbar

Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().hide();
Md Selim
fonte
0

Sou novo no desenvolvimento de aplicativos Android. Enfrentei esse erro e passei quase 5 horas tentando consertá-lo. Por fim, descobri que a causa raiz desse problema era o seguinte e, se alguém enfrentar esse problema novamente no futuro, leia.

Eu estava tentando criar uma atividade doméstica com fundo de vídeo, para a qual tive que alterar o tema pai da configuração padrão de Theme.AppCompat.Light.DarkActionBarpara Theme.AppCompat.Light.NoActionBar. Isso funcionou bem para a atividade inicial, mas quando eu defini um novo botão com um onclicklistener para navegar para outra atividade, onde eu havia definido um texto personalizado para a barra de ação, esse erro é lançado.

Então, o que acabei fazendo foi criar dois temas e atribuí-los às atividades a seguir.

Theme.AppCompat.Light.DarkActionBar - for Activities with Action Bar (default)
Theme.AppCompat.Light.NoActionBar - for Activities without Action Bar 

Fiz as seguintes alterações para corrigir o erro.

  1. Definindo os temas em styles.xml

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
    
    <style name="DefaultTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
  2. Associando as atividades aos seus respectivos temas em AndroidManifest.xml

    <activity android:name=".Payment"
        android:theme="@style/DefaultTheme"/>
    
    <activity android:name=".WelcomeHome"
        android:theme="@style/AppTheme.NoActionBar">
Shaju mathew
fonte
-1

Sempre que tal erro ocorrer. Tente verificar o seguinte

  1. Verifique que tipo de Activity está sendo usado, é uma simples atividade android.app ou AppCompatActivity ou ActionBarActivity e assim por diante.

  2. Verifique se o seu tipo de atividade estendida se enquadra na categoria de compatibilidade

exemplo de atividade / fragmento baseado em android.app não são tipos appCompat, enquanto android.support.v4.app.Fragment ou android.support.v4.app.ActivityCompat são baseados em appCompat

se cair em appCompat, usamos getSupportActionBar (), caso contrário, para tipos de android.app podemos usar getActionBar ()

  1. Verifique o tema aplicado à atividade em questão no arquivo de manifesto

exemplo: No arquivo de manifesto, se o tema aplicado for, digamos, android: theme = "@ android: style / Theme.Holo.Dialog" getActionBar () funcionará

mas se o tema aplicado para a atividade no manifesto for o seguinte android: theme = "@ style / Theme.AppCompat.Light", você terá que usar getSupportActionBar ()

Pir Fahim Shah
fonte
-1

se você criou uma nova barra de ferramentas, verifique se você aplicou o método setSupportActionBar (); irá definitivamente ajudá-lo

Mahendra Tupere
fonte
-3

Tente fazer isso:

                getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                getSupportActionBar().setHomeButtonEnabled(true);
                actionBar = getSupportActionBar();
                actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

Em vez disso:

actionBar = getSupportActionBar();
                actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

                getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                getSupportActionBar().setHomeButtonEnabled(true);
Nahue Federico
fonte
Por que chamar getSupportActionBar()se já tem seu resultado em actionBarvariável? Ambas as variantes são ruins.
Stan,
Você altera getSupportActionBar (); para actionBar = getSupportActionBar (); É o mesmo !!!! Agite uma perna !!!!!
Cabezas de
Não faz nenhuma diferença
crubio