Kesalahan Android [Mencoba memanggil metode virtual 'void android.app.ActionBar' pada referensi objek null]

97

Saya memiliki modul kode yang mengimplementasikan viewpager dengan panel navigasi, namun, ketika saya menjalankan kode, saya mendapatkan kesalahan berikut

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)

menunjuk ke baris ini

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

seluruh kode http://pastebin.com/u1K72fr7

Manifest saya

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

kode http://pastebin.com/EFQLzRej

================================================== ================ EDIT / UPDATE:

Apa yang saya pelajari dari ini

Kapanpun kesalahan seperti itu terjadi

1. Periksa jenis Aktivitas yang digunakan, apakah itu Aktivitas android.app sederhana atau AppCompatActivity atau ActionBarActivity dan sebagainya.

2. Periksa apakah jenis aktivitas Anda yang diperpanjang termasuk dalam kategori compat

Contoh Activity / Fragment berbasis android.app adalah jenis non appCompat, sedangkan android.support.v4.app.Fragment atau android.support.v4.app.ActivityCompat adalah jenis

jika berada di bawah appCompat kita menggunakan getSupportActionBar () lain untuk tipe android.app kita bisa menggunakan getActionBar ()

3. Periksa tema yang diterapkan ke aktivitas yang dimaksud di file manifes

contoh: Dalam file manifes, jika tema diterapkan, katakanlah android: theme = "@ android: style / Theme.Holo.Dialog" getActionBar () akan berfungsi

tetapi jika tema yang diterapkan untuk aktivitas dalam manifes adalah sebagai berikut android: theme = "@ style / Theme.AppCompat.Light" maka Anda harus menggunakan getSupportActionBar ()

ViVekH
sumber
3
apakah kamu mencoba getSupportActionbar()?
Kingfisher Phuoc
saya menggunakan getSupportActionbar sudah dalam kode saya
ViVekH
Apakah Anda menggunakan tema App compat? Anda harus memposting Manifest Anda dengan deklarasi aktivitas Anda di sini untuk bantuan lebih lanjut.
Kingfisher Phuoc
Anda harus melihat kode Anda lagi. Saya bisa mendapatkan supportActionBar(bukan null) dengan tema Anda. Apakah Anda mengganti semuanya getActionBardengan getSupportActionBar? 1 hal lagi, Anda harus memperbarui log kesalahan baru Anda.
Kingfisher Phuoc
1
Saya melihat kode Anda. Sebenarnya, Anda masih menggunakan getActionBar()di MainActivity... Periksa dan ubah ke getSupportActionBar.
Kingfisher Phuoc

Jawaban:

151

Kode Anda membuang 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);

Masalahnya cukup sederhana - Anda Activitymewarisi dari yang baru android.support.v7.app.ActionBarActivity. Anda harus menggunakan panggilan ke getSupportActionBar()alih-alih getActionBar().

Jika Anda melihat di atas sekitar baris 65 kode Anda, Anda akan melihat bahwa Anda sudah melakukannya:

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

Dan kemudian turunkan di sekitar baris 87 sepertinya Anda menemukan hal yang sama:

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

Perhatikan bagaimana Anda berkomentar getActionBar().

Funktional
sumber
8
Sekadar catatan: android.support.v7.app.ActionBarActivitysudah tidak digunakan lagi karena mendukung android.support.v7.app.AppCompatActivity. Tapi masalahnya sama.
Funktional
1
Di dalam sebuah fragmen, lihat di sini
jacktrades
29

Jika ada yang ingin menggunakan android.app.ActionBar dan android.app.Activity Anda harus mengubah tema aplikasi di styles.xml , misalnya:

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

Masalahnya adalah Anda mungkin menggunakan tema AppCompat .

Di sisi lain, jika Anda ingin menggunakan android.support.v7.app.ActionBar dan memperluas aktivitas Anda dengan AppCompatActivity, Anda harus menggunakan tema AppCompat untuk menghindari masalah ini, misalnya:

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

Semoga ini membantu.

crubio
sumber
Anda juga dapat memperpanjang dari AppCompatActivitybukan Activity, seperti dalam jawaban ini .
Keith
Tentu @Keith, jika Anda ingin menggunakan tema AppCompat, Anda harus menggunakan AppCompatActivity jika tidak, Anda akan mengalami masalah ketidakcocokan yang sama.
crubio
@crubio Terima kasih!
Kumaresh Babu NS
18

saat Anda memperluas appcompatActivity lalu gunakan

this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);

dan ketika Anda memperluas ActionBar lalu gunakan

this.getActionBar().setDisplayHomeAsUpEnabled(true);

jangan lupa untuk memanggil fungsi ini di oncreate setelah menginisialisasi toolbar / actionbar

Fazal
sumber
12

Saya pikir yang ingin Anda lakukan adalah cast getActivity (). Sebagai contoh:

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

Inilah yang perlu Anda lakukan dengan pustaka dukungan baru. AppCompatActivity telah menggantikan ActionBarActivity.

ronwill06
sumber
7

Coba cek disini

res >> nilai >> styles.xml

pastikan tidak ada kode seperti ini

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

jika ada kode seperti itu, Anda bisa menonaktifkannya sebentar, atau menghapusnya

Febrianto Nugroho
sumber
Terima kasih telah mengingatkan!! : DI juga tertinggal <item name="windowNoTitle">true</item>, yang harus disingkirkan.
gujci
Bagi saya, yang berhasil adalah hapus android:theme="@style/AppTheme.NoActionBar"dari <avticity>tag di AndroidManifest.xml
Smaily Carrilho
4

Saat menggunakan AppCompatActivity harus memanggil

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

Sebelum 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
sumber
2

Tombol Naik biasanya diaktifkan untuk Aktivitas Tingkat Rendah. Dalam manifes Anda, saya hanya melihat MainActivity. Saya rasa tidak masuk akal untuk mengaktifkan tombol atas untuk aktivitas utama. Buat aktivitas, lalu di manifes tambahkan atribut parentActivityName. Kemudian aktifkan tombol naik pada metode onCreate aktivitas.
Ini akan membantu.
https://developer.android.com/training/appbar/up-action.html

kiiya-natz.dll
sumber
2

Dalam kasus saya adalah karena styles.xmlmengatur tema induk yang salah, yaitu NoActionBartema tentu saja getSupportActionbar()adalah null:

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

Mengubahnya menjadi sesuatu yang lain memperbaikinya:

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

Coba ini semoga berhasil, kode saya berfungsi dengan baik

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

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setTitle("");
Monzur
sumber
1

di baris ini dalam aktivitas Anda:

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

Gunakan ini:

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

* adalah aktivitas Anda

soran
sumber
1

Dalam kasus saya, saya mengalami kesalahan yang sama tetapi kesalahan saya adalah saya tidak mendeklarasikan Toolbar saya.

Jadi, sebelum saya menggunakan getSupportActionBar, saya harus menemukan toolbar saya dan menyetel actionBar

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

    getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_nav_menu);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Jorge Casariego
sumber
1

Saya tahu bahwa pertanyaan ini adalah sesuatu yang kuno. Tapi ini bisa membantu banyak orang yang menghadapi masalah ini.

Untuk mengatasi masalah ini, periksa apakah ada titik nulitas. Kemudian terapkan konfigurasi yang sesuai:

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

Jika Anda menggunakan android.app.ActionBar dan android.app.Activity Anda harus mengubah tema aplikasi dalam tag aplikasi:

< application
     android:theme="@android:style/Theme.Holo.Light">
Hasan Jamshaid
sumber
1

Jika Anda mengalami kesalahan ini

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

Gunakan saja

setSupportActionBar (toolbar). 
kzncrda.dll
sumber
0

Untuk siapa pun yang memiliki BaseActivity, dan anak yang diturunkan darinya, pastikan super.onCreate () dipanggil terlebih dahulu sebelum Anda melakukan apa pun. Aktivitas lama akan berfungsi jika Anda memanggil super.onCreate () sesudahnya.

Child extends Activity - bisa menelepon super setelah Anda melakukan sesuatu

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

Anak memperluas AppCompatActivity - Anda harus memanggil super terlebih dahulu

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

Bagi mereka yang masih mengalami masalah ini, masalah saya telah diselesaikan di file AndroidManifest.xml. Dimana dikatakan<activity android:name=".MainActivity" android:theme="@style/AppTheme.NoActionBar"> , Anda perlu menghapus NoActionBar, membuatnya <activity android:name=".MainActivity" android:theme="@style/AppTheme">, karena dengan NoActionBar mengatur aplikasi tidak tahu apakah ia menginginkan bilah tindakan atau tidak saat Anda memanggilnya di dalam MainActivity.java

Evan H.
sumber
0

Saya mendapat kesalahan yang sama sekali, saya membuat template untuk toolbar default (toolbar.xml) dan kemudian di tampilan lain saya membuat toolbar collapsable.

Saya perlu menambahkan toolbar yang dapat diciutkan ke tampilan yang menampilkan beberapa informasi pengguna (seperti whatsapp), tetapi metode findViewById merujuk pada toolbar default (toolbar id), bukan yang dapat diciutkan (toolbar id juga) ya, saya tulis id yang sama untuk kedua toolbar, jadi ketika saya mencoba mengakses aktivitas aplikasi crash menunjukkan saya kesalahan.

Saya memperbaiki kesalahan dengan mengubah id dari toolbar yang dapat diciutkan menjadi id: col_toolbar dan kesalahan hilang dan aplikasi saya bekerja dengan sempurna

Carlos Fernando
sumber
0

Anda harus mencoba yang ini. Saya pikir itu akan berhasil.

    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
sumber
0

Solusi terbaik lakukan ini dalam metode Oncreate Anda

 ActionBar actionBar = getSupportActionBar();

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

diikuti oleh kelas baru

@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
sumber
Meskipun cuplikan kode ini dapat menjawab pertanyaan, termasuk penjelasan tentang mengapa dan bagaimana cuplikan tersebut membantu memecahkan masalah, meningkatkan kualitas dan umur panjang jawaban Anda. Lihat Bagaimana cara menulis jawaban yang baik?
ammportal
0

Harap tambahkan setelah Toolbar

Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().hide();
Md Selim
sumber
0

Saya baru dalam pengembangan Aplikasi Android. Saya menghadapi kesalahan ini dan menghabiskan hampir 5 jam mencoba memperbaikinya. Akhirnya, saya menemukan berikut ini adalah akar penyebab masalah ini dan jika ada yang menghadapi masalah ini lagi di masa mendatang, tolong baca ini.

Saya mencoba membuat Home Activitiy dengan Video Background, yang mana saya harus mengubah tema induk dari pengaturan default Theme.AppCompat.Light.DarkActionBarmenjadi Theme.AppCompat.Light.NoActionBar. Ini berfungsi dengan baik untuk Aktivitas Rumah, tetapi ketika saya menyetel tombol baru dengan onclicklistener untuk menavigasi ke Aktivitas lain, di mana saya telah menyetel teks khusus ke Bilah Tindakan, kesalahan ini muncul.

Jadi, yang akhirnya saya lakukan adalah membuat dua tema dan menugaskannya ke kegiatan sebagai berikut.

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

Saya telah melakukan perubahan berikut untuk memperbaiki kesalahan tersebut.

  1. Mendefinisikan tema dalam 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. Mengaitkan Aktivitas dengan Tema Masing-masing di AndroidManifest.xml

    <activity android:name=".Payment"
        android:theme="@style/DefaultTheme"/>
    
    <activity android:name=".WelcomeHome"
        android:theme="@style/AppTheme.NoActionBar">
Shaju mathew
sumber
-1

Kapanpun kesalahan seperti itu terjadi. Coba periksa Hal-hal Berikut

  1. Periksa jenis Aktivitas yang digunakan, apakah itu Aktivitas android.app sederhana atau AppCompatActivity atau ActionBarActivity dan sebagainya.

  2. Periksa apakah jenis aktivitas Anda yang diperpanjang termasuk dalam kategori compat

Contoh Activity / Fragment berbasis android.app adalah jenis non appCompat, sedangkan android.support.v4.app.Fragment atau android.support.v4.app.ActivityCompat adalah jenis

jika berada di bawah appCompat kita menggunakan getSupportActionBar () lain untuk tipe android.app kita bisa menggunakan getActionBar ()

  1. Periksa tema yang diterapkan ke aktivitas yang dimaksud di file manifes

contoh: Dalam file manifes, jika tema diterapkan, katakanlah android: theme = "@ android: style / Theme.Holo.Dialog" getActionBar () akan berfungsi

tetapi jika tema yang diterapkan untuk aktivitas dalam manifes adalah sebagai berikut android: theme = "@ style / Theme.AppCompat.Light" maka Anda harus menggunakan getSupportActionBar ()

Pir Fahim Shah
sumber
-1

jika Anda telah membuat toolbar baru kemudian terapkan periksa bahwa Anda telah menerapkan metode setSupportActionBar (); itu pasti akan membantu Anda

Mahendra Tupere
sumber
-3

Coba lakukan ini:

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

Dari pada ini:

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

                getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                getSupportActionBar().setHomeButtonEnabled(true);
Nahue Federico
sumber
Mengapa harus menelepon getSupportActionBar()jika Anda sudah mendapatkan hasilnya dalam actionBarvariabel? Kedua varian itu buruk.
Stan
Anda mengubah getSupportActionBar (); ke actionBar = getSupportActionBar (); Itu sama!!!! Goyangkan kaki !!!!!
Cabezas
Tidak ada bedanya
crubio