Android Hatası [Boş nesne başvurusunda 'void android.app.ActionBar' sanal yöntemini çağırmaya çalışın]


99

Viewpager'ı gezinme çekmecesi ile uygulayan bir kod modülüm var, ancak kodu çalıştırdığımda aşağıdaki hatayı alıyorum

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)

bu çizgiyi işaret ediyor

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

kodun tamamı http://pastebin.com/u1K72fr7

Benim manifestom

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

================================================ ================ DÜZENLE / GÜNCELLEME:

Bundan ne öğrendim

Böyle bir hata meydana geldiğinde

1. Ne tür bir Aktivitenin kullanıldığını kontrol edin, basit bir android.app Aktivitesi mi, bir AppCompatActivity veya bir ActionBarActivity vb.

2. Genişletilmiş etkinlik türünüzün uyum kategorisine girip girmediğini kontrol edin

örnek android.app tabanlı Activity / Fragment, appCompat olmayan türlerdir, oysa android.support.v4.app.Fragment veya android.support.v4.app.ActivityCompat, appCompat tabanlıdır

appCompat'ın altına düşerse getSupportActionBar () kullanırız, aksi takdirde android.app türleri için getActionBar () kullanabiliriz

3. Manifest dosyasında söz konusu etkinliğe uygulanan temayı kontrol edin

örnek: Uygulanan tema varsa manifest dosyasında android: theme = "@ android: style / Theme.Holo.Dialog" ise getActionBar () çalışacaktır

ancak manifest'teki etkinlik için uygulanan tema aşağıdaki gibiyse android: theme = "@ style / Theme.AppCompat.Light" o zaman getSupportActionBar () kullanmanız gerekir


3
denedin getSupportActionbar()mi
Kingfisher Phuoc

getSupportActionbar'ı zaten kodumda kullanıyorum
ViVekH

Uygulama uyumluluğu temasını kullandınız mı? Daha fazla yardım için Manifest'inizi aktivite beyanınızla birlikte buraya göndermelisiniz.
Kingfisher Phuoc

kodunuza tekrar bakmalısınız. Temanızla supportActionBar(boş değil) alabilirim . Hepsini getActionBarile getSupportActionBarmi değiştirdin ? 1 şey daha, yeni hata günlüğünüzü güncellemelisiniz.
Kingfisher Phuoc

1
Koduna baktım. Aslında hala kullanıyorsungetActionBar() senin MainActivity... Kontrol et ve olarak değiştir getSupportActionBar.
Kingfisher Phuoc

Yanıtlar:


152

Kodunuz şunlara dayanıyor 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);

Sorun oldukça basit - sizin yenisinden Activitymiras alıyorsunuz android.support.v7.app.ActionBarActivity. Bunun getSupportActionBar()yerine için bir çağrı kullanmalısınız getActionBar().

Kodunuzun 65. satırına bakarsanız, bunu zaten yaptığınızı görürsünüz:

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

Ve sonra 87. satırın aşağıya inin, aynı şeyi çözmüş gibisiniz:

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

Nasıl yorum yaptığınıza dikkat edin getActionBar().


8
Sadece bir not: android.support.v7.app.ActionBarActivitylehine kullanımdan kaldırıldı android.support.v7.app.AppCompatActivity. Ama mesele aynı.
Funktional

1
Bir parçanın içinde buraya
jacktrades

29

Herhangi biri android.app.ActionBar ve android.app.Activity'yi kullanmak isterse , uygulama temasını styles.xml'de değiştirmelisiniz, örneğin:

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

Sorun şu ki, bir AppCompat teması kullanıyor olabilirsiniz .

Öte yandan, android.support.v7.app.ActionBar'ı kullanmak istiyorsanız ve etkinliğinizi AppCompatActivity ile genişletirseniz, bu sorunu önlemek için bir AppCompat teması kullanmanız gerekir , örneğin:

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

Bu yardımcı olur umarım.


Bu cevapta olduğu gibi AppCompatActivityyerine ' den de uzatabilirsiniz . Activity
Keith

Elbette @ Keith, bir AppCompat teması kullanmak istiyorsanız, bir AppCompatActivity kullanmanız gerekir, aksi takdirde aynı uyumsuzluk sorununa sahip olursunuz.
crubio

@crubio Teşekkürler!
Kumaresh Babu NS

18

Eğer zaman appcompatActivity uzatmak sonra kullanmak

this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);

ve ne zaman İşlem Çubuğu uzatmak ardından kullanımını

this.getActionBar().setDisplayHomeAsUpEnabled(true);

araç çubuğunu / eylem çubuğunu başlattıktan sonra oncreate'de bu işlevi çağırmayı unutmayın


12

Sanırım yapmak istediğiniz şey getActivity () atamak. Örneğin:

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

Yeni destek kitaplıkları ile yapmanız gereken şey budur. AppCompatActivity, ActionBarActivity'nin yerini almıştır.


7

Burayı kontrol etmeyi deneyin

res >> değerler >> styles.xml

böyle bir kod olmadığından emin ol

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

böyle bir kod varsa bir süreliğine devre dışı bırakabilir veya silebilirsiniz


hatırlattığın için teşekkürler !! : DI ayrıca kaldı <item name="windowNoTitle">true</item>, çıkarılması gerekiyordu.
gujci

Benim için ne çalıştı kaldır oldu android:theme="@style/AppTheme.NoActionBar"dan <avticity>AndroidManifest.xml etiketinin
Smaily Carrilho

4

AppCompatActivity kullanıldığında

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

Önce 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

Benim durumumda, styles.xmlyanlış ana tema ayarlanması nedeniyle , yani NoActionBartema elbette getSupportActionbar()boş:

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

Başka bir şeyle değiştirdi, düzeltdi:

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

2

Yukarı Düğmesi genellikle Düşük Düzeyli Etkinlikler için etkinleştirilir. Bildirgende sadece MainActivity'yi görüyorum. Ana aktivite için yukarı düğmesini etkinleştirmenin mantıklı olduğunu sanmıyorum. Bir etkinlik oluşturun, ardından bildirimde parentActivityName özniteliğini ekleyin. Ardından, etkinliğin onCreate yöntemindeki yukarı düğmesini etkinleştirin.
Bu yardımcı olmalı.
https://developer.android.com/training/appbar/up-action.html


2

Bu umudunu dene, işe yarayacak, kodum iyi çalışıyor

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

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

1

aktivitenizde bu satırda:

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

bunu kullan:

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

* senin aktiviten


1

Benim durumumda aynı hatayı aldım, ancak hatam Araç Çubuğumu bildirmemiş olmamdı.

Bu yüzden, getSupportActionBar'ı kullanmadan önce araç çubuğumu bulmam ve actionBar'ı ayarlamam gerekiyordu.

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

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

1

Bu sorunun eski bir soru olduğunu biliyorum. Ancak bu, bu sorunu ortaya koyan birçok kişiye yardımcı olabilir.

Bu sorunu çözmek için, bir boşluk noktası olup olmadığını kontrol edin. Ardından ilgili yapılandırmayı uygulayın:

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

1

Android.app.ActionBar ve android.app.Activity kullanıyorsanız, uygulama etiketindeki uygulama temasını değiştirmelisiniz:

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

1

Bu hatayla karşılaşırsanız

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

Sadece kullan

setSupportActionBar (toolbar). 

0

BaseActivity'ye sahip olan ve ondan uzanan bir çocuğu olan herhangi biri için, herhangi bir şey yapmadan önce super.onCreate () işlevinin ilk olarak çağrıldığından emin olun. Daha sonra super.onCreate () işlevini çağırırsanız eski Etkinlik çalışacaktır.

Çocuk Aktiviteyi uzatır - bir şeyler yaptıktan sonra süper arayabilir

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

Çocuk, AppCompatActivity'yi genişletir - önce süper'i aramalısınız

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

0

Hala bu sorunu yaşayanlar için sorunum AndroidManifest.xml dosyasında çözüldü. Yazan yere <activity android:name=".MainActivity" android:theme="@style/AppTheme.NoActionBar">, kaldırmak gerekir NoActionBaryapma, <activity android:name=".MainActivity" android:theme="@style/AppTheme">NoActionBar ile size MainActivity.java içinde birini çağırmak bir eylem çubuğu isteyip istemediğine uygulama doesnt know-set, çünkü


0

Aynı hatayı bir kez aldım, varsayılan bir araç çubuğu (toolbar.xml) için bir şablon oluşturdum ve sonra başka bir görünümde daraltılabilir bir araç çubuğu oluşturdum.

Kullanıcının bazı bilgilerini (whatsapp gibi) gösteren bir görünüme daraltılabilir araç çubuğunu eklemem gerekiyordu, ancak findViewById yöntemi daraltılabilir olana (id araç çubuğu) değil varsayılan araç çubuğuna (id araç çubuğu) başvuruyordu evet, yazdım Her iki araç çubuğuna da aynı kimlik, bu yüzden etkinliğe erişmeye çalıştığımda uygulama bana hatayı göstererek çöktü.

Daraltılabilir araç çubuğunun kimliğini id: col_toolbar olarak değiştirerek hatayı düzelttim ve hata kayboldu ve uygulamam mükemmel çalıştı


0

Bunu denemelisin. Bence işe yarayacak.

    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

En iyi çözüm, bunu Oncreate yönteminizde yapın

 ActionBar actionBar = getSupportActionBar();

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

ardından yeni bir sınıf

@Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();

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

        return super.onOptionsItemSelected(item);
    }

Bu kod parçacığı, sorunun neden ve nasıl çözüldüğüne ilişkin bir açıklama da dahil olmak üzere soruyu yanıtlasa da, yanıtınızın kalitesini ve ömrünü artırır. Bkz Ben iyi cevap yazmak nasıl?
ammportal

0

Lütfen sonrasına ekleyin Toolbar

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

0

Android Uygulama geliştirmede yeniyim. Bu hatayla karşılaştım ve düzeltmek için neredeyse 5 saat harcadım. Son olarak, bu sorunun temel nedeninin aşağıdakiler olduğunu öğrendim ve gelecekte bu sorunla tekrar karşılaşacak biri varsa, lütfen bunu okuyun.

Video Arkaplanlı bir Ev Etkinliği oluşturmaya çalışıyordum, bunun için ana temayı varsayılan ayardan olan ana temayı olarak değiştirmem Theme.AppCompat.Light.DarkActionBargerekiyordu.Theme.AppCompat.Light.NoActionBar . Bu, Ev Etkinliği için iyi çalıştı, ancak Eylem Çubuğuna özel bir metin ayarladığım başka bir Etkinliğe gitmek için onclicklistener ile yeni bir düğme ayarladığımda bu hata atıldı.

Yani, sonunda yaptığım şey iki tema oluşturmak ve bunları aşağıdaki gibi faaliyetlere atamaktı.

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

Hatayı düzeltmek için aşağıdaki değişiklikleri yaptım.

  1. Styles.xml'de temaları tanımlama

    <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. Faaliyetleri İlgili Temalarla İlişkilendirme AndroidManifest.xml

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

-1

Böyle bir hata meydana geldiğinde. Aşağıdaki Şeyleri kontrol etmeye çalışın

  1. Ne tür bir Aktivitenin kullanıldığını kontrol edin, basit bir android.app Aktivitesi mi, bir AppCompatActivity veya bir ActionBarActivity vb.

  2. Genişletilmiş etkinlik türünüzün uyum kategorisine girip girmediğini kontrol edin

örnek android.app tabanlı Activity / Fragment, appCompat olmayan türlerdir, oysa android.support.v4.app.Fragment veya android.support.v4.app.ActivityCompat, appCompat tabanlıdır

appCompat'ın altına düşerse getSupportActionBar () kullanırız, aksi takdirde android.app türleri için getActionBar () kullanabiliriz

  1. Manifest dosyasında söz konusu etkinliğe uygulanan temayı kontrol edin

örnek: Uygulanan tema varsa manifest dosyasında android: theme = "@ android: style / Theme.Holo.Dialog" ise getActionBar () çalışacaktır

ancak manifest'teki etkinlik için uygulanan tema aşağıdaki gibiyse android: theme = "@ style / Theme.AppCompat.Light" o zaman getSupportActionBar () kullanmanız gerekir


-1

yeni bir araç çubuğu oluşturduysanız, setSupportActionBar () yöntemini uygulayıp uygulamadığınızı kontrol edin; sana kesinlikle yardım edecek


-3

Bunu yapmayı dene:

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

Bunun yerine:

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

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

getSupportActionBar()Zaten sonucun actionBardeğişkeni varsa neden çağırmalı ? Her iki varyant da kötü.
Stan

GetSupportActionBar (); actionBar = getSupportActionBar (); Aynısı!!!! Bir bacak salla !!!!!
Cabezas

Hiç fark etmez
crubio
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.