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


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().


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.


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


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.


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ąć


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

    }
}

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


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

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

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ść


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

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

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

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

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

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


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


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

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

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

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

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


-1

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


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.