getActionBar () null değerini döndürür


176

Garip bir sorun yaşıyorum. Targetsdk 13 ile bir uygulama yapıyorum.

Benim ana faaliyetin onCreate yönteminde getActionBar()eylem çubuğumu ayarlamak için çağırıyorum. Android 3.2 öykünücüsünde çalışırken bu iyi çalışır, ancak Android 3.0 ve 3.1 kullanırken getActionBar()yöntem null değerini döndürür.

Bunu son derece garip buluyorum ve bunu yapmasının bir sebebini göremiyorum. Uygulamamın bir eylem çubuğuna sahip olmasını sağlamak için bu emülatörlerle ilgili bir hata mı yoksa yapmam gereken bir şey mi var?

ÇÖZÜM: Sanırım bu soruna bir çözüm buldum. Ben aktivite için bir düzen ayarlamak için setContentView kullanmıyordu. Bunun yerine fragmentTransaction.add(android.R.id.content, mFragment, mTag)etkinliğe bir parça eklemek için kullanıyordum . Bu 3.2'de iyi çalıştı, ancak önceki petek sürümlerinde, onCreate()yöntemde setContentView kullanmıyorsanız eylem çubuğu görünüşte ayarlanmamış . Bu yüzden setContentView()yöntemimdeki yöntemi kullanarak onCreate()ve sadece boş bir FrameLayout içeren bir düzen sağlayarak sabitledim. fragmentTransaction.add(android.R.id.content, mFragment, mTag)Yöntemi hala eskisi gibi kullanabilirim .

En güzel düzeltme değil, ama işe yarıyor.


başka bir gönderiyi yanıtlarken işaret ettiğiniz gibi Holo temasına ihtiyacınız var. Holo temanızı yalnızca v13 res klasöründe belirttiğinizi düşünmüyor musunuz? Çok açık geliyorsa özür dilerim.
PJL

Hayır, bu benim ilk düşüncemdi, ama durum böyle değil. Yine de cevabınız için teşekkürler.
Christian Skogsberg

Yanıtlar:


226

Kullanabilir getSupportActionBar()yerine getActionBar()yöntemle.


buradan, benim için yaptım!
msysmilu

16
teşekkürler, ben "android.support.v7.app.ActionBarActivity" kullanıyordum bu yüzden bu benim için yaptım.
velval

1
2 saatlik aramadan sonra! GetSupportActionBar () ve android.support.v7.app.ActionBarActivity'yi değiştirmek nihayet benim için düzeltiyor.
FacePalm

Sorunun çözümü budur.
16:48

46

Destek kitaplığını kullanıyorsanız

import android.support.v7.app.ActionBarActivity;

public class MainActivity extends ActionBarActivity {

kullanım getSupportActionBar()yerinegetActionBar()

* Güncelleme:

ActionBarActivity sınıfı artık kullanımdan kaldırıldı:

import android.support.v7.app.ActionBarActivity;

Kullanmanızı tavsiye ederim:

import android.support.v7.app.AppCompatActivity

içinde android.support.v7.app: ActionBarActivitykullanımdan kaldırıldı android.support.v7.app.AppCompatActivity.
A. Petrov

35

Etkinlik görünümünü oluşturmadan önce pencere türünü eylem çubuğu olarak tanımlamanız gerekir.

kullanım

requestWindowFeature(Window.FEATURE_ACTION_BAR);

setContentView () yöntemini çağırmadan önce.


GetSupportActionBar () işe yaramazsa, bu bir cazibe gibi çalışır
Ashwin Balani

35
  1. android.support.v7.app.AppCompatActivity kullanıyorsanız

    public class HomeActivity, AppCompatActivity'yi genişletiyor {

O zaman android.support.v7.app.ActionBar kullanıyor olmalısınız

  ActionBar ab = getSupportActionBar();
  1. Android.support.v4.app.FragmentActivity kullanıyorsanız

    public class HomeActivity, FragmentActivity'yi genişletiyor {

o zaman android.app.ActionBar kullanıyor olmalısınız

    ActionBar ab = getActionBar();
  1. Android.support.v7.app.ActionBarActivity kullanıyorsanız

    public class HomeActivity, ActionBarActivity'yi genişletiyor {

android.support.v7.app.ActionBar kullanıyor olmalısınız

   ActionBar ab = getSupportActionBar();

Büyük cevap, karışıklık ele !!
sud007

31

getActionBar()Yöntemin null döndürdüğü yukarıdaki sorunla karşılaştım . getActionBar()Ayarladıktan sonra çağırıyordu setContentView()ve hala onun dönen bir null.

Başlangıçta eksik olan Android Manifest dosyasında min-sdk sürümünü ayarlayarak sorunu çözdüm. <uses-sdk android:minSdkVersion="11" />


4
Bu bana çok zaman kazandırdı! Android SDK'da Bluetooth Sohbet örneği uygulamasını kullanan herkesin bu düzeltmeyi kullanması gerekir. Uygulamanın manifesti "android:" ad alanını minSdkVersion etiketine eklemeyi ihmal ediyor ve bu nedenle kayıt olmuyor. Ad alanının eklenmesi, eylem çubuğunun bulunamamasıyla ilgili bir hatayı düzeltir. Özensiz, Google!
Nick

Aslında targetSdkVersion'ı belirtmeniz gerekebilir. Uyumlu kitaplık kullanıyorsanız daha düşük bir minSdkVersion ile çalışabilirsiniz, ancak targetSdkVersion davranışı belirler.
William

Harika!! Aradığım şey buydu.
swiftBoy

<kullanır-sdk android: minSdkVersion = "11" /> benim sorun teşekkürler çözüldü
Majid

27

ActionBar, bir uygulama başlığına sahip olmak için uygulama veya etkinliğin Temasına ihtiyaç duyar. Uygulamanızı veya etkinliğinizi Theme.NOTITLE olarak biçimlendirmediğinizden emin olun.

<application
    android:name="com.xxx.yyy"
    android:debuggable="false"
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:theme="@style/Theme.NoTitle"> // remove this line if you have this in your code


<activity
        android:name="com.xxx.yyy.Activity"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:theme="@style/Theme.NoTitle"  // remove this line if you have in your code
        android:windowSoftInputMode="adjustResize|stateHidden" > 

19
import android.support.v7.app.AppCompatActivity;

sonra

extends AppCompatActivity

sonra kullan

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Google'ın gezinme çekmecesi örneğindeki sorunumu giderir.
Weishi Zeng

İyi bir çözüm, ancak uygulayacak olanlar için büyük olasılıkla uyumluluk tabanlı hatalar alacaktır. Bunu yaparsanız, android.app.FragmentTransaction ve android.support.v7.app.ActionBar yerine android.app.ActionBar
Serj

18

Bu yanıt gecikti ancak Google'dan gelen herkes için yararlı olabilir: Bildirmeniz gerekebilir

<item name="android:windowActionBar">true</item>

sizin styles.xml. Görünüşe göre falsevarsayılan olabilir. Ayrıca API 11 veya üstünde olmanız gerekir.

Daha fazla ayrıntıyı buradaki belgelerde bulabilirsiniz . Özellikle, alıntı:

İpucu: İşlem çubuğunu kaldırmak istediğiniz özel bir etkinlik temanız varsa android: windowActionBar stil özelliğini false olarak ayarlayın. Ancak, eylem çubuğunu bir tema kullanarak kaldırırsanız, pencere eylem çubuğuna hiç izin vermez, bu nedenle daha sonra ekleyemezsiniz; getActionBar () çağrısı null değerini döndürür.


11

Aynı sorunu yaşadım ve çözümlerden biri, setContentView()aramadan önce kullanmaktıgetActionBar() .

Ancak sorunu düzelten başka bir şey daha vardı. Uygulamanın olması için tema belirttim @android:style/Theme.Holo.Light.

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.Holo.Light" >
    ...
</application>

Bence içinde bulunan herhangi bir tema <item name="android:windowActionBar">true</item>kullanılabilir.


Teşekkürler, benim için çalışıyor. Benim durumumda, getActionBar () yöntemi de null döndürdü ve tema stilini Theme.Holo.Light olarak değiştirerek çözebilirdim. Diğer bazı temalarla (örn. Theme.AppCompat), ActionBar'ın aktif olmadığı, bu nedenle değerinin boş olduğu görülmektedir.
harrakiss

10

Bunun ana nedeni, ActionBar'ı desteklemeyen temaları kullanmaktır:

Manifest dosyasında aşağıdakileri hedef etkinliğinize veya uygulama öğenize ekleyin (temayı tüm uygulama üzerinde birleştirmek istiyorsanız)

Eylem çubuğunu destekleyen tema örnekleri "Theme.AppCompat.Light"veya "Theme.Holo.Light"...

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

Tüm stilleri koymak styles.xmlve her yerde kullanmak daha iyidir, "@style/themName"böylece önceki stil

android:theme="@style/AppTheme"

ve styles.xml aşağıdakilere sahip olacaktır:

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

İpuçları:

  • "@android:style/Theme.Holo.Light.DarkActionBar"SDK 14 sürümünden önce desteklenmeyen eski SDK'larda kullanılamayan bazı temalar vardır .
  • Uygulamanızın SDK'nın minimum belirli sürümünü desteklemesine izin vermek için <app>öğe altına aşağıdakileri ekleyebilirsiniz :

    <uses-sdk android:minSdkVersion="14" />
  • AndroidStudio'da minimum SDK sürümünü belirtmek için uygulamanın Gradle dosyasını kullanabilirsiniz.

    android{
      defaultConfig{
        minSdkVersion 14
        targetSdkVersion 21
      }
    }

ama Theme.Holo.Light.DarkActionBar
Sid

8

Bu sorunla karşılaştım. Sürüm numarasını kontrol ediyordum ve eylem çubuğunu yalnızca Honeycomb'a eşit veya daha büyükse etkinleştiriyordum, ancak null döndürüyordu. Sebebini ve kök nedenini değerleri-v11 klasörü altında style.xml içinde Holo Tema stilini devre dışı bırakmış olduğumu buldum.


Holo Tema'yı AppTheme uygulamamın ana teması olarak kullanarak sorunumu çözdüm.
Bharat Dodeja

7

AndroidManifest.xml dosyasına gidin ve değiştirin

android: theme = "@ stil / AppTheme"

by 

android: theme = "@ android: tarzı / Theme.Holo.Light.DarkActionBar"



4

Benim durumumda, ben işe yaramadı kodumda vardı:

@Override
protected void onCreate(Bundle savedInstanceState) {
    context = getApplicationContext();

    requestWindowFeature(Window.FEATURE_ACTION_BAR);

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
}

Sonra kodun sırası ile oynadı:

@Override
protected void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_ACTION_BAR);

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    context = getApplicationContext();
}

Ve işe yaradı!

Sonuç: onCreate yönteminde çağırdığınız ilk şey requestWindowFeature olmalıdır.


3

Aynı sorunu yaşadım. Styles.xml dosyasında Uygulama temasını değiştirerek çözüldü

Önce

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

Sonra

<!-- Base application theme. -->
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">

2

Ben sadece bu içine koştu beri eklemek istedim bir şey, bir üst olan bir Aktivite üzerindeAActionBar () almaya çalışıyorsanız, null dönecektir. Benim Aktivite bir ActivityGroup içinde bulunduğu kodu refactor çalışıyorum ve benim için nasıl bir ActionBar kaynak oluşturulur oluşur kaynağına baktıktan sonra "oh duh" gitmek için iyi bir kaç dakika sürdü.


Çözümünüzü etkinlik grupları için gönderebilir misiniz?
Anthea

Ne hatırlıyorum benim çözüm herhangi bir ActivityGroups kullanmak için kodumu yeniden. Üzgünüz kod parçacıklarım yok :(
C Nick

Bu aslında bir çözüm değil; daha fazla yorum. Ama çok kullanışlı!
Kato

1

Bu değişikliklerle çözdüm:

  1. en küçük değişiklik android:theme="@android:style/Theme.Holo.Light" >
  2. sınıfa ekle extends ActionBarActivity
  3. sınıfa ithalat ekle import android.support.v7.app.ActionBarActivity

1

Diğer cevaplara eklemek için:

Emin çağrı yapın setActionBar()ya setSupportActionBar()da içinde onCreate()çağırmadan önce yöntemiyle getActionBar():

Activity.xml dosyasında, sonra onCreate () öğesinde bazı Araç Çubuğu tanımlayın:

Toolbar toolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(toolbar);
// Now you can use the get methods:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

0

Bu soru hakkında partiye geç (ve Android'de yeni) geç kaldığımı biliyorum, ancak buradaki bilgileri çok yararlı buldum ve ActionBar'ın benim gibi başkalarının gelmesi durumunda istediğim gibi çalışmasını sağlayarak kendi çabalarımın bulgularını eklemem gerektiğini düşündüm. Yardım istiyorum.

Hiçbir pencere başlığı ile yüzen bir pencere olan bir widget var. Ben uygulamak için bir stil tema kullanmak android:windowIsFloating, android:backgroundDimEnabledveandroid:windowNoTitle . Widget, birkaç liste parçası sayfası içeren bir parça çağrı cihazı adı verilen ve ActionBar kullanılana kadar bir düğme eklemek isteyene kadar iyi çalıştı. Boş bir işaretçi istisnasıyla çağrı cihazı etkinliğinde kilitlenir. ActionBar'ın boş olmasına daralttım. Bu konuya katkıda bulunan önceki kişilerin bulgularını takiben, manifest dosyasından temamı kaldırdım ve ActionBar iyi çalıştı, ancak şimdi pencerem daha uzun sürdü (tam ekran) ve istemediğim bir sayfa başlığı vardı.

Daha fazla araştırma beni bir çözüme götüren Stiller ve Temalar API Eğitim Kılavuzu'na götürdü. Özel temamı manifest dosyasındaki bireysel etkinliklere ekleyebilirken, uygulamaya uygulamadan önce keşfettim. Tüm pencerelerim artık istenen görünüme sahip.


0

Activity sınıfınızı ActionBarActivity'den genişletmeyi deneyin. Bu benim için çözdü. Aşağıdaki gibi bir şey yapın:

public class MyActivity extends ActionBarActivity
{
  . . .

Benim durumumda sınıf sadece Aktiviteden uzanıyordu.


0

Bu, bazı insanlara da yardımcı olabilir.

Benim durumumda, bunun nedeni menu.xml dosyasında bir bağlam tanımlamamış olmasıydı

Bunu dene:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.android.ActionBarActivity">

Bunun yerine:

<menu xmlns:android="http://schemas.android.com/apk/res/android">

0

Komut tıklaması ile kaynak kodun uygulanmasını kontrol etmeniz yeterlidir:

    private void initWindowDecorActionBar() {
    Window window = getWindow();

    // Initializing the window decor can change window feature flags.
    // Make sure that we have the correct set before performing the test below.
    window.getDecorView();

    if (isChild() || !window.hasFeature(Window.FEATURE_ACTION_BAR) || mActionBar != null) {
        return;
    }

    mActionBar = new WindowDecorActionBar(this);
    mActionBar.setDefaultDisplayHomeAsUpEnabled(mEnableDefaultActionBarUp);

    mWindow.setDefaultIcon(mActivityInfo.getIconResource());
    mWindow.setDefaultLogo(mActivityInfo.getLogoResource());
}

requestWindowFeature (Window.FEATURE_ACTION_BAR); RequestWindowFeature (Window.FEATURE_ACTION_BAR) başarısız olduğunu gördüğümde sorunum düzeltildi; kodu açık kaynak kullanımı !!


0

android.support.v7.app.ActionBar actionBar = getSupportActionBar();

oldukça hızlı çalışıyor


3
Bu kod soruyu cevaplayabilirken, sorunun nasıl ve / veya neden çözüldüğüne dair ek bağlam sağlamak yanıtlayıcının uzun vadeli değerini artıracaktır.
Nic3500

0

Benim durumumda ben sadece uzatmak zorunda AppCompatActivityyerineActivity

    supportActionBar?.setDisplayHomeAsUpEnabled(true)

Tam etkinlik örnek sınıfı:

içe aktarma android.os.Bundle içe aktarma androidx.appcompat.app.AppCompatActivity

//class LocationFound : Activity() { <-----Does not seem to work with ActionBar in recent versions
class LocationFound : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_location_found)

        supportActionBar?.setDisplayHomeAsUpEnabled(true)
    } }

Sürümlerde

    minSdkVersion 22
    targetSdkVersion 29
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.