Ошибка Android [Попытка вызвать виртуальный метод void android.app.ActionBar для ссылки на пустой объект]

99

У меня есть модуль кода, который реализует 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: theme = "@ style / Theme.Tabwithpager"

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

================================================== ================ РЕДАКТИРОВАТЬ / ОБНОВЛЕНИЕ:

Что я узнал из этого

Всякий раз, когда возникает такая ошибка

1. Проверьте, какой вид Activity используется, простой ли это Activity android.app, AppCompatActivity или ActionBarActivity и так далее.

2. Проверьте, подпадает ли ваш расширенный вид деятельности под категорию совместимости.

пример Activity / Fragment на основе 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 () будет работать

но если тема, примененная для действия в манифесте, выглядит следующим образом: android: theme = "@ style / Theme.AppCompat.Light", тогда вам нужно использовать getSupportActionBar ()

ВиВекХ
источник
3
ди вы пытаетесь getSupportActionbar()?
Kingfisher Phuoc,
Я уже использую getSupportActionbar в своем коде
ViVekH
Вы использовали тему совместимости приложений? Вам следует разместить здесь свой манифест с объявлением о деятельности, чтобы получить дополнительную помощь.
Kingfisher Phuoc,
вам следует еще раз взглянуть на свой код. Я могу получить supportActionBar(не ноль) с вашей темой. Вы заменили все getActionBarна getSupportActionBar? Еще одна вещь, вам следует обновить свой новый журнал ошибок.
Kingfisher Phuoc,
1
Я посмотрел твой код. Фактически, вы все еще используете getActionBar()в своем MainActivity... Отметьте это и измените на getSupportActionBar.
Kingfisher Phuoc,

Ответы:

152

Ваш код бросает 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. Но проблема та же.
Funktional
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">

Надеюсь это поможет.

Crubio
источник
Вы также можете расширить от AppCompatActivityвместо Activity, как в этом ответе .
Кейт
Конечно, @Keith, если вы хотите использовать тему AppCompat, вы должны использовать AppCompatActivity, иначе у вас будет такая же проблема несовместимости.
crubio
@crubio Спасибо!
Kumaresh Babu NS
18

когда вы расширяете appcompatActivity, используйте

this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);

и когда вы расширяете ActionBar, используйте

this.getActionBar().setDisplayHomeAsUpEnabled(true);

не забудьте вызвать эту функцию в oncreate после инициализации панели инструментов / панели действий

Фазаль
источник
12

Я думаю, что вы хотите использовать getActivity (). Например:

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

Это то, что вам нужно сделать с новыми библиотеками поддержки. AppCompatActivity заменил ActionBarActivity.

ronwill06
источник
7

Попробуйте проверить здесь

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

убедитесь, что нет такого кода

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

если есть такой код, можно на время отключить или стереть

Фебрианто Нугрохо
источник
Спасибо за напоминание!! : D Я тоже оставил в том <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);

    }
}
Ахмад Агазаде
источник
3

В моем случае это связано с тем, что styles.xmlустановлена ​​неправильная родительская тема, т.е. NoActionBarтема, конечно getSupportActionbar()же, нулевая:

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

Поменял на что-то другое, исправил:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
Фрукты
источник
2

Кнопка «Вверх» обычно активируется для низкоуровневых действий. В вашем манифесте я вижу только файл MainActivity. Не думаю, что имеет смысл активировать кнопку вверх для основного действия. Создайте действие, затем в манифесте добавьте атрибут parentActivityName. Затем активируйте кнопку вверх в методе onCreate действия.
Это должно помочь.
https://developer.android.com/training/appbar/up-action.html

киия-нац
источник
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, мне нужно было найти свою панель инструментов и установить actionBar

    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);
}
Quimbo
источник
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). 
kzncrda
источник
0

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

Ребенок расширяет активность - может вызвать super после того, как вы что-то сделали

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

Ребенок расширяет AppCompatActivity - сначала нужно вызвать super

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState); //do this first
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
1майк12
источник
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), а не на сворачиваемую (также панель инструментов 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 часов, пытаясь ее исправить. Наконец, я обнаружил, что основной причиной этой проблемы было следующее, и если кто-то снова столкнется с этой проблемой в будущем, прочтите это.

Я пытался создать Home Activitiy с видео-фоном, для чего мне пришлось изменить родительскую тему с настройки по умолчанию 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. Проверьте, какой вид Activity используется: простое действие android.app, AppCompatActivity или ActionBarActivity и т. Д.

  2. Проверьте, подпадает ли ваш расширенный вид деятельности под категорию совместимости

пример Activity / Fragment на основе 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 () будет работать

но если для действия в манифесте применяется следующая тема: android: theme = "@ 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переменной? Оба варианта плохие.
Stan
Вы меняете getSupportActionBar (); в actionBar = getSupportActionBar (); Это то же самое!!!! Трясти ногой!!!!!
Cabezas,
Это не имеет никакого значения
crubio