Помилка Android [Спроба викликати віртуальний метод 'void android.app.ActionBar' у нульовій посиланні на об'єкт]


97

У мене є модуль коду, який реалізує viewpager з ящиком навігації, однак, коли я запускаю код, я отримую наступну помилку

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)

вказує на цей рядок

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

весь код http://pastebin.com/u1K72fr7

Мій маніфест

<?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: topic = "@ style / Theme.Tabwithpager"

код http://pastebin.com/EFQLzRej

===================================================== ================ редагувати / оновлювати:

Що я з цього навчився

Щоразу, коли виникає така помилка

1. Перевірте, який тип діяльності використовується, чи це проста android.app активність чи AppCompatActivity чи ActionBarActivity тощо.

2. Перевірте, чи поширюється ваш тип діяльності, який поширюється, під категорію compat

Наприклад, активність / фрагмент на основі android.app - це не appCompat типи, тоді як android.support.v4.app.Fragment або android.support.v4.app.ActivityCompat базуються на програмі appCompat

якщо він підпадає під appCompat, ми використовуємо getSupportActionBar () інше для типів android.app, ми можемо використовувати getActionBar ()

3. Перевірте тему, застосовану до відповідної діяльності у файлі маніфесту

Приклад: У файлі маніфесту, якщо застосованою темою є скажіть android: theme = "@ android: style / Theme.Holo.Dialog" getActionBar () буде працювати

але якщо тема, яка застосовується для активності в маніфесті, має такий андроїд: topic = "@ style / Theme.AppCompat.Light", тоді ви повинні використовувати getSupportActionBar ()


3
ти спробуєш getSupportActionbar()?
Кінгфішер Пхуок

Я використовую getSupportActionbar вже в своєму коді
ViVekH,

Чи використовували ви програму compat topic? Ви можете опублікувати свій Маніфест із декларацією про діяльність тут, щоб отримати подальшу допомогу.
Кінгфішер Пхук

ви повинні переглянути свій код ще раз. Я можу отримати supportActionBar(не нульовий) вашу тему. Ви замінити всі getActionBarз getSupportActionBar? Ще одна річ, ви повинні оновити свій новий журнал помилок.
Кінгфішер Пхуок

1
Я подивився на ваш код. Насправді ви все ще використовуєте getActionBar()у своєму MainActivity... Перевірте це та змініть на getSupportActionBar.
Кінгфішер Пхуок

Відповіді:


151

Ваш код додає 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);

Проблема досить проста Activity- ви успадковуєте нове android.support.v7.app.ActionBarActivity. Ви повинні використовувати дзвінок до, getSupportActionBar()а не getActionBar().

Якщо ви подивіться вище на рядок 65 свого коду, ви побачите, що це вже робите:

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

А потім вниз по лінії 87 схоже, ви зрозуміли те саме:

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

Зверніть увагу, як ви коментували getActionBar().


8
Лише зауваження: android.support.v7.app.ActionBarActivityзастаріло на користь android.support.v7.app.AppCompatActivity. Але питання те саме.
Опції

1
Всередині фрагмента дивіться тут
jacktrades

29

Якщо хтось хоче використовувати android.app.ActionBar та android.app.Activity, ви повинні змінити тему програми у styles.xml , наприклад:

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

Проблема полягає в тому, що ви могли використовувати тему AppCompat .

З іншого боку, якщо ви хочете використовувати android.support.v7.app.ActionBar і розширюєте свою діяльність за допомогою AppCompatActivity, вам слід використовувати тему AppCompat, щоб уникнути цієї проблеми, наприклад:

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

Сподіваюся, це допомагає.


Ви також можете поширитись AppCompatActivityзамість Activity, як у цій відповіді .
Кіт

Звичайно @Keith, якщо ви хочете використовувати тему AppCompat, ви повинні використовувати AppCompatActivity, інакше у вас виникне та сама проблема несумісності.
crubio

@crubio Спасибі!
Кумареш Бабу НШ

18

коли ви розширюєте appcompatActivity, тоді використовуйте

this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);

а коли ви продовжите ActionBar, тоді використовуйте

this.getActionBar().setDisplayHomeAsUpEnabled(true);

не забудьте викликати цю функцію в oncreate після ініціалізації панелі інструментів / панелі дій


12

Я думаю, що ви хочете зробити це кинути getActivity (). Наприклад:

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

Це те, що вам потрібно зробити з новими бібліотеками підтримки. AppCompatActivity замінила ActionBarActivity.


7

Спробуйте перевірити тут

res >> значення >> styles.xml

переконайтесь, що немає такого коду

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

якщо такий код є, його можна на деякий час відключити або стерти


дякую за нагадування !! : Також залишився Д.І. <item name="windowNoTitle">true</item>, який довелося видалити.
gujci

Для мене те, що працювало, було видалити android:theme="@style/AppTheme.NoActionBar"з <avticity>тегу на AndroidManifest.xml
Smaily Carrilho

4

При використанні AppCompatActivity повинен зателефонувати

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

До цього 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

Кнопка вгору зазвичай активується для заходів низького рівня. У вашому маніфесті я бачу лише MainActivity. Я не думаю, що має сенс активувати кнопку вгору для основної діяльності. Створіть активність, а потім у маніфест додайте атрибут parentActivityName. Потім активуйте кнопку вгору за методом onCreate діяльності.
Це має допомогти.
https://developer.android.com/training/appbar/up-action.html


2

У моєму випадку це через те, що styles.xmlвстановлено неправильну батьківську тему, тобто NoActionBarтема звичайно getSupportActionbar()є нульовою:

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

Змінили його на щось інше, виправили це:

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

2

Спробуйте це сподіватися, що він спрацює, мій код працює чудово

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

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setTitle("");

1

у цьому рядку у вашій діяльності:

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

використовуй це:

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

* це ваша діяльність


1

У моєму випадку у мене була така ж помилка, але моя помилка полягала в тому, що я не оголосив свою Панель інструментів.

Отже, перш ніж використовувати getSupportActionBar, мені довелося знайти свою панель інструментів і встановити панель дій

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

    getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_nav_menu);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

1

Я знаю, що це питання щось старе. Але це може допомогти багатьом, хто представляє цю проблему.

Щоб вирішити цю проблему, перевірте, чи є точка недійсності. Потім застосуйте відповідну конфігурацію:

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

1

Якщо ви використовуєте android.app.ActionBar та android.app.Activity, ви повинні змінити тему програми в тезі програми:

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

1

Якщо ви зіткнулися з цією помилкою

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

Просто використовуйте

setSupportActionBar (toolbar). 

0

Для всіх, хто має BaseActivity, і дитини, яка поширюється на нього, переконайтесь, що super.onCreate () викликається спочатку, перш ніж робити що-небудь. Стара активність діяла б, якщо ви потім подзвонили super.onCreate ().

Дитина розширює активність - може зателефонувати супер після того, як ви зробите щось

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

Дитина розширює AppCompatActivity - вам потрібно зателефонувати супер першим

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

0

Для тих, хто все ще не має цієї проблеми, мою проблему було вирішено у файлі AndroidManifest.xml. Там, де це написано <activity android:name=".MainActivity" android:theme="@style/AppTheme.NoActionBar">, потрібно видалити NoActionBar, зробивши це <activity android:name=".MainActivity" android:theme="@style/AppTheme">, оскільки при встановленні NoActionBar додаток не знає, хоче він чи не бажає панелі дій, коли ви викликаєте її всередині MainActivity.java


0

Одного разу я отримав таку ж помилку, я створив шаблон для панелі інструментів за замовчуванням (toolbar.xml), а потім в іншому представленні створив панель інструментів, що згортається.

Мені потрібно додати панель інструментів, що згортається, до представлення, яке відображає певну інформацію користувача (наприклад, Whatsapp), але метод findViewById посилався на панель інструментів за замовчуванням (id toolbar), а не на згорнуту (також панель інструментів id) Так, я написав однаковий ідентифікатор для обох панелей інструментів, тому коли я намагався отримати доступ до активності, програма зазнала збоїв, показавши мені помилку.

Я виправив помилку, змінивши ідентифікатор збірної панелі інструментів на id: col_toolbar і помилка пішла, і моя програма працювала ідеально


0

Спробуйте спробувати цю. Я думаю, це спрацює.

    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

Найкраще рішення зробити це у вашому методі Oncreate

 ActionBar actionBar = getSupportActionBar();

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

за ним новий клас

@Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();

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

        return super.onOptionsItemSelected(item);
    }

Хоча цей фрагмент коду може відповісти на питання, включаючи пояснення, чому і як він допомагає вирішити проблему, покращує якість та довговічність вашої відповіді. Див. Як написати гарну відповідь?
ammportal

0

Будь ласка, додайте після Toolbar

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

0

Я новачок у розробці додатків для Android. Я зіткнувся з цією помилкою і витратив майже 5 годин на її виправлення. Нарешті, я з'ясував, що наступна причина була в цьому питанні, і якщо хтось знову зіткнеться з цим питанням, будь ласка, будь ласка, прочитайте це.

Я намагався створити «Домашню активність» з фоном відео, для чого мені довелося змінити батьківську тему з налаштування за замовчуванням Theme.AppCompat.Light.DarkActionBarнаTheme.AppCompat.Light.NoActionBar . Це добре спрацювало з домашньою діяльністю, але коли я встановив нову кнопку за допомогою onclicklistener для переходу до іншої діяльності, де я встановив спеціальний текст на панелі дій, ця помилка видається.

Отже, те, що я в кінцевому підсумку робив, - це створити дві теми та призначити їх таким чином.

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

Я вніс такі зміни, щоб виправити помилку.

  1. Визначення тем у 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. Пов’язання діяльності з їх відповідними темами у AndroidManifest.xml

    <activity android:name=".Payment"
        android:theme="@style/DefaultTheme"/>
    
    <activity android:name=".WelcomeHome"
        android:theme="@style/AppTheme.NoActionBar">

-1

Щоразу, коли виникає така помилка. Спробуйте перевірити наступні речі

  1. Перевірте, який тип діяльності використовується, чи це проста android.app активність чи AppCompatActivity чи ActionBarActivity тощо.

  2. Перевірте, чи поширюється ваш тип діяльності, який підпадає під категорію compat

Наприклад, активність / фрагмент на основі android.app - це не appCompat типи, тоді як android.support.v4.app.Fragment або android.support.v4.app.ActivityCompat базуються на програмі appCompat

якщо він підпадає під appCompat, ми використовуємо getSupportActionBar () інше для типів android.app, ми можемо використовувати getActionBar ()

  1. Перевірте тему, застосовану до відповідної діяльності у файлі маніфесту

Приклад: У файлі маніфесту, якщо застосованою темою є скажіть android: theme = "@ android: style / Theme.Holo.Dialog" getActionBar () буде працювати

але якщо тема, яка застосовується для активності в маніфесті, має такий андроїд: topic = "@ style / Theme.AppCompat.Light", тоді ви повинні використовувати getSupportActionBar ()


-1

якщо ви створили нову панель інструментів, тоді застосуйте перевірте, чи ви застосували метод setSupportActionBar (); це безпомилково допоможе тобі


-3

Спробуйте зробити це:

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

Замість цього:

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

                getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                getSupportActionBar().setHomeButtonEnabled(true);

Навіщо дзвонити, getSupportActionBar()якщо у нього вже є результат actionBarзмінної? Обидва варіанти погані.
Стен

Ви змінюєте getSupportActionBar (); to actionBar = getSupportActionBar (); Це ж!!!! Трясти ногу !!!!!
Cabezas

Це не має ніякої різниці
crubio
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.