Error de Android [intento de invocar el método virtual 'void android.app.ActionBar' en una referencia de objeto nulo]

97

Tengo un módulo de código que implementa viewpager con cajón de navegación, sin embargo, cuando ejecuto el código, aparece el siguiente error

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)

apunta a esta línea

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

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

Mi manifiesto

<?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 / ACTUALIZAR:

Lo que aprendí de esto

Siempre que ocurra tal error

1. Compruebe qué tipo de actividad se está utilizando, si es una actividad simple de android.app o una AppCompatActivity o una ActionBarActivity y así sucesivamente.

2. Compruebe si el tipo de actividad que se extiende se incluye en la categoría de compatibilidad.

Ejemplo de actividad / fragmento basado en android.app no ​​son tipos de appCompat, mientras que android.support.v4.app.Fragment o android.support.v4.app.ActivityCompat están basados ​​en appCompat

si cae bajo appCompat usamos getSupportActionBar () de lo contrario para los tipos de android.app podemos usar getActionBar ()

3. Verifique el tema aplicado a la actividad en cuestión en el archivo de manifiesto.

ejemplo: en el archivo de manifiesto, si el tema aplicado es, diga android: theme = "@ android: style / Theme.Holo.Dialog" getActionBar () funcionará

pero si el tema aplicado para la actividad en el manifiesto es el siguiente android: theme = "@ style / Theme.AppCompat.Light", entonces debe usar getSupportActionBar ()

ViVekH
fuente
3
¿Intentaste getSupportActionbar()?
Kingfisher Phuoc
ya estoy usando getSupportActionbar en mi código
ViVekH
¿Usaste el tema de compatibilidad de aplicaciones? Debe publicar su manifiesto con su declaración de actividad aquí para obtener más ayuda.
Kingfisher Phuoc
deberías mirar tu código nuevamente. Puedo obtener supportActionBar(no nulo) con tu tema. ¿Reemplazó todo getActionBarcon getSupportActionBar? Una cosa más, debería actualizar su nuevo registro de errores.
Kingfisher Phuoc
1
Miré tu código. De hecho, todavía lo usas getActionBar()en tu MainActivity... Compruébalo y cámbiate a getSupportActionBar.
Kingfisher Phuoc

Respuestas:

151

Tu código está lanzando 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);

El problema es bastante simple: Activityestá heredando de lo nuevo android.support.v7.app.ActionBarActivity. Deberías usar una llamada a en getSupportActionBar()lugar de getActionBar().

Si mira arriba alrededor de la línea 65 de su código, verá que ya lo está haciendo:

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

Y luego más abajo alrededor de la línea 87, parece que descubrió lo mismo:

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

Fíjate cómo comentaste getActionBar().

Funktional
fuente
8
Solo una nota: android.support.v7.app.ActionBarActivityse ha desaprobado a favor de android.support.v7.app.AppCompatActivity. Pero el problema es el mismo.
Funcional
1
Dentro de un fragmento, ver aquí
jacktrades
29

Si alguien quiere usar android.app.ActionBar y android.app.Activity , debe cambiar el tema de la aplicación en styles.xml , por ejemplo:

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

El problema es que podría estar usando un tema de AppCompat .

Por otro lado, si desea usar android.support.v7.app.ActionBar y extiende su actividad con AppCompatActivity, entonces debe usar un tema de AppCompat para evitar este problema, por ejemplo:

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

Espero que esto ayude.

crubio
fuente
También puede extender desde en AppCompatActivitylugar de Activity, como en esta respuesta .
Keith
Seguro @Keith, si desea usar un tema de AppCompat, debe usar una AppCompatActivity; de lo contrario, tendrá el mismo problema de incompatibilidad.
crubio
@crubio ¡Gracias!
Kumaresh Babu NS
18

cuando extiendes appcompatActivity , usa

this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);

y cuando extiendes ActionBar , usa

this.getActionBar().setDisplayHomeAsUpEnabled(true);

no olvide llamar a esta función en una creación después de inicializar la barra de herramientas / barra de acciones

Fazal
fuente
12

Creo que lo que quieres hacer es lanzar getActivity (). Por ejemplo:

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

Esto es lo que debe hacer con las nuevas bibliotecas de soporte. AppCompatActivity ha reemplazado a ActionBarActivity.

ronwill06
fuente
7

Intenta comprobar aquí

res >> valores >> styles.xml

asegúrese de que no haya un código como este

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

si hay un código como ese, puede deshabilitarlo por un tiempo o borrarlo

Febrianto Nugroho
fuente
¡¡Gracias por recordar!! : DI también dejó adentro <item name="windowNoTitle">true</item>, que tuvo que ser removido.
gujci
Para mí, lo que funcionó fue eliminar android:theme="@style/AppTheme.NoActionBar"de la <avticity>etiqueta en AndroidManifest.xml
Smaily Carrilho
4

Cuando use AppCompatActivity debe llamar

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

antes de 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
fuente
2

El botón Arriba generalmente se activa para actividades de bajo nivel. En su manifiesto, solo veo MainActivity. No creo que tenga sentido activar el botón de arriba para la actividad principal. Cree una actividad, luego en el manifiesto agregue el atributo parentActivityName. Luego, active el botón arriba en el método onCreate de la actividad.
Esto debería ayudar.
https://developer.android.com/training/appbar/up-action.html

kiiya-natz
fuente
2

En mi caso, se debe a que styles.xmlconfiguré el tema principal incorrecto, es decir, el tema, NoActionBarpor supuesto, getSupportActionbar()es nulo:

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

Lo cambié por algo más lo solucionó:

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

Prueba esto espero que funcione, mi código funciona bien

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

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

en esta línea de tu actividad:

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

utilizar este:

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

* es tu actividad

soran
fuente
1

En mi caso tuve el mismo error, pero mi error fue que no declaré mi barra Google.

Entonces, antes de usar getSupportActionBar, tuve que encontrar mi barra de herramientas y configurar la barra de acción

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

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

Sé que esta pregunta es algo antigua. Pero esto puede ayudar a muchos que presentan este problema.

Para solucionar este problema, compruebe si existe un punto de nulidad. Luego aplique la configuración correspondiente:

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

Si está utilizando android.app.ActionBar y android.app.Activity, debe cambiar el tema de la aplicación en la etiqueta de la aplicación:

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

Si encuentra este error

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

Solo usa

setSupportActionBar (toolbar). 
kzncrda
fuente
0

Para cualquier otra persona que tenga una BaseActivity, y un hijo que se extienda a partir de ella, asegúrese de que se llame primero a super.onCreate () antes de hacer cualquier cosa. La actividad anterior funcionaría si llamaras a super.onCreate () después.

El niño extiende la actividad: podría llamar súper después de que hicieras cosas

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

El niño extiende AppCompatActivity: primero debes llamar a Super

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

Para aquellos que todavía tienen este problema, mi problema se resolvió en el archivo AndroidManifest.xml. Donde dice <activity android:name=".MainActivity" android:theme="@style/AppTheme.NoActionBar">, debe eliminarlo NoActionBar, hacerlo <activity android:name=".MainActivity" android:theme="@style/AppTheme">, porque con NoActionBar configurado, la aplicación no sabe si quiere o no una barra de acción cuando llama a una dentro de MainActivity.java

Evan H.
fuente
0

Recibí el mismo error una vez, creé una plantilla para una barra de herramientas predeterminada (toolbar.xml) y luego, en otra vista, creé una barra de herramientas plegable.

Necesitaba agregar la barra de herramientas plegable a una vista que muestra cierta información del usuario (como whatsapp), pero el método findViewById hacía referencia a la barra de herramientas predeterminada (barra de herramientas de identificación), no a la barra de herramientas plegable (barra de herramientas de identificación también) sí, escribí la misma identificación en ambas barras de herramientas, así que cuando intenté acceder a la actividad, la aplicación se bloqueó y me mostró el error.

Solucioné el error cambiando la identificación de la barra de herramientas plegable a id: col_toolbar y el error desapareció y mi aplicación funcionó perfectamente

Carlos fernando
fuente
0

Deberías probar este. Creo que 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
fuente
0

La mejor solución haz esto en tu método Oncreate

 ActionBar actionBar = getSupportActionBar();

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

seguido de una nueva clase

@Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();

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

        return super.onOptionsItemSelected(item);
    }
Steven Muyingo
fuente
Si bien este fragmento de código puede responder a la pregunta, incluir una explicación de por qué y cómo ayuda a resolver el problema mejora la calidad y la longevidad de su respuesta. Consulte ¿Cómo escribo una buena respuesta?
ammportal
0

Por favor agregue después Toolbar

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

Soy nuevo en el desarrollo de aplicaciones de Android. Me enfrenté a este error y pasé casi 5 horas tratando de solucionarlo. Finalmente, descubrí que lo siguiente era la causa principal de este problema y si alguien enfrenta este problema nuevamente en el futuro, por favor lea esto.

Estaba intentando crear una actividad en el hogar con un fondo de video, para lo cual tuve que cambiar el tema principal de la configuración predeterminada de Theme.AppCompat.Light.DarkActionBara Theme.AppCompat.Light.NoActionBar. Esto funcionó bien para la actividad de inicio, pero cuando configuro un nuevo botón con un escuchador de clics para navegar a otra actividad, donde había configurado un texto personalizado en la barra de acción, aparece este error.

Entonces, lo que terminé haciendo fue crear dos temas y asignarlos a las actividades de la siguiente manera.

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

He realizado los siguientes cambios para corregir el error.

  1. Definiendo los temas en 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. Asociar las actividades a sus respectivos temas en AndroidManifest.xml

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

Siempre que ocurra tal error. Intenta comprobar lo siguiente

  1. Compruebe qué tipo de actividad se está utilizando, si es una actividad simple de android.app o una AppCompatActivity o ActionBarActivity y así sucesivamente.

  2. Verifique si su tipo de actividad que se extiende cae dentro de la categoría de compatibilidad

Ejemplo de actividad / fragmento basado en android.app no ​​son tipos de appCompat, mientras que android.support.v4.app.Fragment o android.support.v4.app.ActivityCompat están basados ​​en appCompat

si cae bajo appCompat usamos getSupportActionBar () de lo contrario para los tipos de android.app podemos usar getActionBar ()

  1. Verifique el tema aplicado a la actividad en cuestión en el archivo de manifiesto

ejemplo: en el archivo de manifiesto, si el tema aplicado es, diga android: theme = "@ android: style / Theme.Holo.Dialog" getActionBar () funcionará

pero si el tema aplicado para la actividad en el manifiesto es el siguiente android: theme = "@ style / Theme.AppCompat.Light", entonces debe usar getSupportActionBar ()

Pir Fahim Shah
fuente
-1

si ha creado una nueva barra de herramientas, entonces aplique compruebe que ha aplicado el método setSupportActionBar (); definitivamente te ayudará

Mahendra Tupere
fuente
-3

Intente hacer esto:

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

En lugar de esto:

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

                getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                getSupportActionBar().setHomeButtonEnabled(true);
Nahue Federico
fuente
¿Por qué llamar getSupportActionBar()si ya tiene su resultado en actionBarvariable? Ambas variantes son malas.
Stan
Cambia getSupportActionBar (); to actionBar = getSupportActionBar (); ¡¡¡¡Es lo mismo!!!! ¡¡¡¡¡Sacude una pierna!!!!!
Cabezas
No hace ninguna diferencia
crubio