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

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

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

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

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

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

1. Проверьте, какой тип действия используется, это простое действие 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()

Ответ 1

Ваш код набрасывает 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().

Ответ 2

Если кто-то хочет использовать 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">

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

Ответ 3

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

this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);

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

this.getActionBar().setDisplayHomeAsUpEnabled(true);

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

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

Ответ 6

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

Ответ 7

В моем случае у меня была такая же ошибка, но моя ошибка заключалась в том, что я не объявлял свою панель инструментов.

Итак, прежде чем использовать getSupportActionBar, мне пришлось найти свою панель инструментов и установить actionBar

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

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

Ответ 8

При использовании 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);

    }
}

Ответ 9

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

Child extends Activity - может вызвать super после того, как вы сделали материал

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

Ответ 10

Если вы используете android.app.ActionBar и android.app.Activity, вы должны изменить тему приложения в теге приложения:

< Приложение

Android: тема = "@андроид: стиль /Theme.Holo.Light" >

Ответ 11

в этой строке в вашей деятельности:

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

используйте это:

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

* - ваша деятельность

Ответ 12

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

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

Изменено это на что-то еще исправленное:

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

Ответ 13

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

Ответ 14

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

Мне потребовалось добавить свернутую панель инструментов в представление, которое отображает некоторую информацию о пользователе (например, whatsapp), но метод findViewById ссылался на панель инструментов по умолчанию (панель инструментов id), а не на свернутую (также панель инструментов id), да, я написал один и тот же идентификатор для обеих панелей инструментов, поэтому, когда я пытался получить доступ к активности, приложение зависало, показывая мне ошибку.

Я исправил ошибку, изменив идентификатор сворачиваемой панели инструментов на id: col_toolbar, и ошибка исчезла, и мое приложение работало отлично

Ответ 15

Я знаю, что этот вопрос - что-то старое. Но это может помочь многим, кто представляет эту проблему.

Чтобы решить эту проблему, проверьте, есть ли точка недействительности. Затем примените соответствующую конфигурацию:

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

Ответ 16

Вы должны попробовать это. Я думаю, что это будет работать.

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

Ответ 17

Лучшее решение сделать это в вашем методе 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);
    }

Ответ 18

Попробуйте сделать это:

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