Błąd systemu Android [próba wywołania metody wirtualnej „void android.app.ActionBar” w odwołaniu do obiektu o wartości null]

97

Mam moduł kodu, który implementuje viewpager z szufladą nawigacji, jednak po uruchomieniu kodu pojawia się następujący błąd

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)

wskazuje na tę linię

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

cały kod http://pastebin.com/u1K72fr7

Mój manifest

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

kod http://pastebin.com/EFQLzRej

==================================================== ================ EDYCJA / AKTUALIZACJA:

Czego się z tego nauczyłem

Ilekroć wystąpi taki błąd

1. Sprawdź, jakiego rodzaju Aktywność jest używana, czy jest to proste działanie android.app, AppCompatActivity, czy ActionBarActivity i tak dalej.

2. Sprawdź, czy Twój typ aktywności, który jest rozszerzony, mieści się w kategorii kompatybilności

przykład Aktywność / fragment oparty na android.app nie jest typem appCompat, podczas gdy android.support.v4.app.Fragment lub android.support.v4.app.ActivityCompat są oparte na appCompat

jeśli mieści się w appCompat, używamy getSupportActionBar (), w przeciwnym razie dla typów android.app możemy użyć getActionBar ()

3. Sprawdź motyw zastosowany do danej czynności w pliku manifestu

przykład: w pliku manifestu, jeśli zastosowano motyw, powiedzmy android: theme = "@ android: style / Theme.Holo.Dialog" getActionBar () będzie działać

ale jeśli motyw zastosowany do działania w manifeście jest następujący android: theme = "@ style / Theme.AppCompat.Light", musisz użyć metody getSupportActionBar ()

ViVekH
źródło
3
czy ty spróbujesz getSupportActionbar()?
Kingfisher Phuoc
Używam getSupportActionbar już w moim kodzie
ViVekH
Czy użyłeś motywu zgodności aplikacji? Aby uzyskać dalszą pomoc, należy zamieścić tutaj swój Manifest wraz z deklaracją aktywności.
Kingfisher Phuoc
powinieneś ponownie spojrzeć na swój kod. Mogę uzyskać supportActionBar(nie zerową) z Twoim motywem. Czy zastąpić wszystko getActionBarz getSupportActionBar? Jeszcze 1 rzecz, powinieneś zaktualizować swój nowy dziennik błędów.
Kingfisher Phuoc
1
Spojrzałem na twój kod. Właściwie nadal używasz getActionBar()w swoim MainActivity... Sprawdź to i zmień na getSupportActionBar.
Kingfisher Phuoc

Odpowiedzi:

151

Twój kod rzuca się na 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);

Problem jest dość prosty Activity- dziedziczysz po nowym android.support.v7.app.ActionBarActivity. Powinieneś używać wywołania getSupportActionBar()zamiast getActionBar().

Jeśli spojrzysz powyżej linii 65 kodu, zobaczysz, że już to robisz:

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

A potem niżej wokół linii 87 wygląda na to, że odkryłeś to samo:

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

Zwróć uwagę, jak skomentowałeś getActionBar().

Funkcjonalne
źródło
8
Tylko uwaga: android.support.v7.app.ActionBarActivityzostał wycofany na korzyść android.support.v7.app.AppCompatActivity. Ale problem jest ten sam.
Funktional
1
Wewnątrz fragmentu, patrz tutaj
jacktrades
29

Jeśli ktoś chce używać android.app.ActionBar i android.app.Activity , powinien zmienić motyw aplikacji w styles.xml , na przykład:

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

Problem polega na tym, że możesz używać motywu AppCompat .

Z drugiej strony, jeśli chcesz używać android.support.v7.app.ActionBar i rozszerzasz swoją aktywność o AppCompatActivity , musisz użyć motywu AppCompat, aby uniknąć tego problemu, na przykład:

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

Mam nadzieję że to pomoże.

crubio
źródło
Możesz także przedłużyć z AppCompatActivityzamiast Activity, jak w tej odpowiedzi .
Keith
Jasne @Keith, jeśli chcesz użyć motywu AppCompat, musisz użyć AppCompatActivity, w przeciwnym razie będziesz mieć ten sam problem z niekompatybilnością.
crubio
@crubio Thanks!
Kumaresh Babu NS
18

kiedy rozszerzasz appcompatActivity, użyj

this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);

a kiedy rozszerzasz ActionBar, użyj

this.getActionBar().setDisplayHomeAsUpEnabled(true);

nie zapomnij wywołać tej funkcji w oncreate po zainicjowaniu paska narzędzi / paska akcji

Fazal
źródło
12

Myślę, że chcesz rzucić getActivity (). Na przykład:

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

Oto, co musisz zrobić z nowymi bibliotekami wsparcia. AppCompatActivity zastąpił ActionBarActivity.

ronwill06
źródło
7

Spróbuj sprawdzić tutaj

res >> wartości >> styles.xml

upewnij się, że nie ma takiego kodu

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

jeśli istnieje taki kod, możesz go na chwilę wyłączyć lub usunąć

Febrianto Nugroho
źródło
Dziękuję za przypomnienie!! : DI również zostawił <item name="windowNoTitle">true</item>, który musiał zostać usunięty.
gujci
Dla mnie to, co zadziałało, zostało usunięte android:theme="@style/AppTheme.NoActionBar"z <avticity>tagu na AndroidManifest.xml
Smaily Carrilho
4

W przypadku korzystania z AppCompatActivity musi wywołać

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

Przed 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
źródło
2

Przycisk W górę jest zwykle aktywowany dla działań niskiego poziomu. W twoim manifeście widzę tylko MainActivity. Nie sądzę, aby aktywacja przycisku w górę dla głównego działania miała sens. Utwórz działanie, a następnie w manifeście dodaj atrybut parentActivityName. Następnie aktywuj przycisk w górę w metodzie onCreate działania.
To powinno pomóc.
https://developer.android.com/training/appbar/up-action.html

kiiya-natz
źródło
2

W moim przypadku jest to spowodowane styles.xmlustawieniem niewłaściwego motywu nadrzędnego, czyli NoActionBarmotyw oczywiście getSupportActionbar()jest pusty:

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

Zmieniłem to na coś innego, naprawiłem to:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
Owoc
źródło
2

Spróbuj mieć nadzieję, że zadziała, mój kod działa dobrze

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

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setTitle("");
Monzur
źródło
1

w tym wierszu w swojej działalności:

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

Użyj tego:

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

* to twoja aktywność

soran
źródło
1

W moim przypadku miałem ten sam błąd, ale moim błędem było to, że nie zadeklarowałem mojego paska narzędzi Toolbar.

Tak więc, zanim użyłem getSupportActionBar, musiałem znaleźć mój pasek narzędzi i ustawić actionBar

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

    getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_nav_menu);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Jorge Casariego
źródło
1

Wiem, że to pytanie jest stare. Ale może to pomóc wielu osobom, które przedstawiają ten problem.

Aby rozwiązać ten problem, sprawdź, czy istnieje punkt nieważności. Następnie zastosuj odpowiednią konfigurację:

if(getSupportActionBar() != null){
 getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 getSupportActionBar().setHomeButtonEnabled(true);
}
Quimbo
źródło
1

Jeśli używasz android.app.ActionBar i android.app.Activity, powinieneś zmienić motyw aplikacji w tagu aplikacji:

< application
     android:theme="@android:style/Theme.Holo.Light">
Hasan Jamshaid
źródło
1

Jeśli napotkasz ten błąd

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

Po prostu użyj

setSupportActionBar (toolbar). 
kzncrda
źródło
0

Dla każdego, kto ma BaseActivity i dziecko, które z niej wyrasta, upewnij się, że super.onCreate () jest wywoływane jako pierwsze, zanim cokolwiek zrobisz. Stara aktywność działałaby, gdybyś później wywołał super.onCreate ().

Dziecko rozszerza Aktywność - może zadzwonić do super, gdy coś zrobisz

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

Dziecko rozszerza AppCompatActivity - najpierw musisz zadzwonić super

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState); //do this first
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
1mike12
źródło
0

Dla tych, którzy nadal mają ten problem, mój problem został rozwiązany w pliku AndroidManifest.xml. Tam, gdzie jest napisane <activity android:name=".MainActivity" android:theme="@style/AppTheme.NoActionBar">, musisz usunąć NoActionBar, robiąc to <activity android:name=".MainActivity" android:theme="@style/AppTheme">, ponieważ przy ustawieniu NoActionBar aplikacja nie wie, czy chce paska akcji, gdy wywołujesz go w MainActivity.java

Evan H.
źródło
0

Kiedyś wystąpił ten sam błąd, utworzyłem szablon dla domyślnego paska narzędzi (toolbar.xml), a następnie w innym widoku utworzyłem zwijany pasek narzędzi.

Wymagałem dodania zwijanego paska narzędzi do widoku, który pokazuje niektóre informacje o użytkowniku (jak WhatsApp), ale metoda findViewById odwołuje się do domyślnego paska narzędzi (pasek narzędzi id), a nie zwijanego (również pasek narzędzi id) tak, napisałem ten sam identyfikator do obu pasków narzędzi, więc kiedy próbowałem uzyskać dostęp do działania, aplikacja uległa awarii, pokazując mi błąd.

Naprawiłem błąd, zmieniając identyfikator zwijanego paska narzędzi na id: col_toolbar i błąd zniknął, a moja aplikacja działała idealnie

Carlos Fernando
źródło
0

Powinieneś spróbować tego. Myślę, że to zadziała.

    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
źródło
0

Najlepsze rozwiązanie to zrobić w metodzie Oncreate

 ActionBar actionBar = getSupportActionBar();

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

po którym następuje nowa klasa

@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
źródło
Chociaż ten fragment kodu może odpowiedzieć na pytanie, w tym wyjaśnić, dlaczego i jak pomaga rozwiązać problem, poprawia jakość i trwałość odpowiedzi. Zobacz: Jak napisać dobrą odpowiedź?
ammportal
0

Dodaj później Toolbar

Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().hide();
Md Selim
źródło
0

Jestem nowy w tworzeniu aplikacji na Androida. Napotkałem ten błąd i spędziłem prawie 5 godzin próbując go naprawić. W końcu dowiedziałem się, że główną przyczyną tego problemu jest następujący problem i jeśli ktoś, kto stanie się z tym problemem ponownie w przyszłości, przeczytaj to.

Próbowałem stworzyć aktywność domową z tłem wideo, dla której musiałem zmienić motyw nadrzędny z domyślnego ustawienia Theme.AppCompat.Light.DarkActionBarna Theme.AppCompat.Light.NoActionBar. To działało dobrze w przypadku działania domowego, ale kiedy ustawię nowy przycisk z listwą onclick, aby przejść do innego działania, w którym ustawiłem niestandardowy tekst na pasku akcji, ten błąd jest generowany.

W końcu stworzyłem dwa tematy i przypisałem je do poniższych działań.

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

Wprowadziłem następujące zmiany, aby naprawić błąd.

  1. Definiowanie motywów w 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. Powiązanie działań z odpowiadającymi im tematami w AndroidManifest.xml

    <activity android:name=".Payment"
        android:theme="@style/DefaultTheme"/>
    
    <activity android:name=".WelcomeHome"
        android:theme="@style/AppTheme.NoActionBar">
Mathew Shaju
źródło
-1

Ilekroć wystąpi taki błąd. Spróbuj sprawdzić następujące rzeczy

  1. Sprawdź, jakiego rodzaju aktywność jest używana, czy jest to prosta aktywność android.app, czy AppCompatActivity, czy ActionBarActivity i tak dalej.

  2. Sprawdź, czy rozszerzony typ aktywności mieści się w kategorii kompatybilności

przykład Aktywność / fragment oparty na android.app nie jest typem appCompat, podczas gdy android.support.v4.app.Fragment lub android.support.v4.app.ActivityCompat są oparte na appCompat

jeśli mieści się w appCompat, używamy getSupportActionBar (), w przeciwnym razie dla typów android.app możemy użyć getActionBar ()

  1. Sprawdź motyw zastosowany do danego działania w pliku manifestu

przykład: w pliku manifestu, jeśli zastosowano motyw, powiedzmy android: theme = "@ android: style / Theme.Holo.Dialog" getActionBar () będzie działać

ale jeśli motyw zastosowany do działania w manifeście jest następujący android: theme = "@ style / Theme.AppCompat.Light", musisz użyć metody getSupportActionBar ()

Pir Fahim Shah
źródło
-1

jeśli utwórz nowy pasek narzędzi, zastosuj, sprawdź, czy zastosowałeś metodę setSupportActionBar (); to zdecydowanie ci pomoże

Mahendra Tupere
źródło
-3

Spróbuj to zrobić:

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

Zamiast tego:

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

                getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                getSupportActionBar().setHomeButtonEnabled(true);
Nahue Federico
źródło
Po co dzwonić, getSupportActionBar()jeśli masz już wynik w actionBarzmiennej? Oba warianty są złe.
Stan
Zmieniasz getSupportActionBar (); to actionBar = getSupportActionBar (); To jest to samo!!!! Zatańczyć!!!!!
Cabezas
To nie ma znaczenia
crubio