getActionBar () mengembalikan nol

176

Saya mengalami masalah aneh. Saya membuat aplikasi dengan targetdk 13.

Dalam metode onCreate aktivitas utama saya, saya menelepon getActionBar()untuk menyiapkan bilah tindakan saya. Ini berfungsi dengan baik ketika berjalan pada emulator Android 3.2, tetapi ketika menggunakan Android 3.0 dan 3.1 getActionBar()metode mengembalikan nol.

Saya menemukan ini sangat aneh, dan saya tidak dapat melihat alasan mengapa itu akan terjadi. Apakah ini bug dengan emulator atau ada sesuatu yang perlu saya lakukan, untuk memastikan bahwa aplikasi saya memiliki actionbar?

SOLUSI: Saya pikir saya telah menemukan solusi untuk masalah ini. Saya tidak menggunakan setContentView untuk mengatur tata letak aktivitas. Sebagai gantinya saya menggunakan fragmentTransaction.add(android.R.id.content, mFragment, mTag)untuk menambahkan sebuah fragmen ke aktivitas. Ini berfungsi dengan baik di 3.2, tetapi dalam versi honeycomb sebelumnya bilah tindakan tampaknya tidak disetel jika Anda tidak menggunakan setContentView dalam onCreate()metode. Jadi saya memperbaikinya dengan menggunakan setContentView()metode dalam onCreate()metode saya dan hanya menyediakannya dengan tata letak yang berisi FrameLayout kosong. Saya masih bisa menggunakan fragmentTransaction.add(android.R.id.content, mFragment, mTag)metode dengan cara yang sama seperti sebelumnya.

Ini bukan perbaikan tercantik, tetapi berhasil.

Christian Skogsberg
sumber
saat Anda menunjuk dalam menjawab posting lain Anda memerlukan tema Holo. Jangan kira Anda menentukan tema holo hanya di folder res v13? Maaf jika itu terdengar terlalu jelas.
PJL
Tidak, itu juga pikiran pertamaku, tapi bukan itu masalahnya. Terima kasih atas balasan Anda.
Christian Skogsberg

Jawaban:

226

Dapat digunakan getSupportActionBar()sebagai pengganti getActionBar()metode.

Amir
sumber
dari semua dari sini, ini berhasil untukku!
msysmilu
16
terima kasih, saya menggunakan "android.support.v7.app.ActionBarActivity" jadi ini berhasil untuk saya.
velval
1
Setelah 2 jam mencari! Mengubah ke getSupportActionBar () dan android.support.v7.app.ActionBarActivity akhirnya memperbaikinya untuk saya.
FacePalm
Ini adalah solusi untuk masalah ini.
zygimantus
46

Jika Anda menggunakan perpustakaan dukungan

import android.support.v7.app.ActionBarActivity;

public class MainActivity extends ActionBarActivity {

gunakan getSupportActionBar()sebagai gantigetActionBar()

* Perbarui:

Kelas ActionBarActivity sekarang sudah usang:

import android.support.v7.app.ActionBarActivity;

Saya merekomendasikan untuk menggunakan:

import android.support.v7.app.AppCompatActivity
Jorgesys
sumber
di dalam android.support.v7.app: ActionBarActivityGunakan yang sudah tidak digunakan lagi android.support.v7.app.AppCompatActivity.
A. Petrov
35

Anda harus mendefinisikan jenis jendela sebagai bilah tindakan sebelum aktivitas membuat tampilan.

menggunakan

requestWindowFeature(Window.FEATURE_ACTION_BAR);

sebelum memanggil metode setContentView ().

kaushal trivedi
sumber
Jika getSupportActionBar () tidak berfungsi, maka ini berfungsi seperti pesona
Ashwin Balani
35
  1. jika Anda menggunakan android.support.v7.app.AppCompatActivity

    HomeActivity kelas publik memperluas AppCompatActivity {

Maka Anda harus menggunakan android.support.v7.app.ActionBar

  ActionBar ab = getSupportActionBar();
  1. Jika Anda menggunakan android.support.v4.app.FragmentActivity

    HomeActivity kelas publik memperluas FragmentActivity {

maka Anda harus menggunakan android.app.ActionBar

    ActionBar ab = getActionBar();
  1. Jika Anda menggunakan android.support.v7.app.ActionBarActivity

    HomeActivity kelas publik memperluas ActionBarActivity {

Anda harus menggunakan android.support.v7.app.ActionBar

   ActionBar ab = getSupportActionBar();
Hitesh Sahu
sumber
Jawaban yang bagus, mengatasi kebingungan !!
sud007
31

Saya menghadapi masalah di atas di mana getActionBar()metode mengembalikan null. Saya menelepon getActionBar()setelah pengaturan setContentView()dan masih mengembalikan a null.

Saya menyelesaikan masalah dengan mengatur versi min-sdk dalam file Android Manifest yang hilang pada awalnya. <uses-sdk android:minSdkVersion="11" />

Rajendra
sumber
4
Ini menghemat banyak waktu saya! Siapa pun yang menggunakan aplikasi contoh Obrolan Bluetooth di Android SDK perlu menggunakan perbaikan ini. Manifes aplikasi mengabaikan untuk memasukkan namespace "android:" di tag minSdkVersion-nya sehingga tidak terdaftar. Menambahkan namespace memperbaiki kesalahan dengan bilah tindakan tidak ditemukan. Ceroboh, Google!
Nick
Sebenarnya Anda mungkin hanya perlu menentukan targetSdkVersion. Anda dapat menjalankan dengan minSdkVersion yang lebih rendah jika Anda menggunakan pustaka compat, tetapi targetSdkVersion menentukan perilaku.
William
Bagus!! ini yang saya cari.
swiftBoy
<uses-sdk android: minSdkVersion = "11" /> menyelesaikan masalah saya, terima kasih
Majid
27

ActionBar membutuhkan Tema aplikasi atau aktivitas untuk memiliki judul aplikasi. Pastikan Anda belum menata aplikasi atau aktivitas Anda sebagai Theme.NOTITLE.

<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" > 
Himanshu Virmani
sumber
19
import android.support.v7.app.AppCompatActivity;

kemudian

extends AppCompatActivity

lalu gunakan

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Abilash Rajasekaran
sumber
memperbaiki masalah saya dalam contoh laci navigasi google.
Weishi Zeng
Solusi yang bagus, namun bagi mereka yang akan mengimplementasikannya kemungkinan besar akan mendapatkan kesalahan berbasis kompatibilitas. Jika Anda kebetulan melakukannya, pastikan untuk memeriksa impor Anda di android.support.v4.app.FragmentTransaction, bukan hanya android.app.FragmentTransaction dan android.support.v7.app.ActionBar, bukan android.app.ActionBar
Serj Ardovic
18

Jawaban ini terlambat tetapi mungkin bermanfaat bagi siapa pun yang datang dari Google: Anda mungkin perlu menyatakan

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

di Anda styles.xml. Tampaknya falsebisa menjadi default. Anda juga harus menggunakan API 11 atau lebih tinggi.

Rincian lebih lanjut dapat ditemukan di dokumentasi di sini . Secara khusus, kutipan:

Kiat: Jika Anda memiliki tema aktivitas khusus tempat Anda ingin menghapus bilah tindakan, setel properti gaya android: windowActionBar ke false. Namun, jika Anda menghapus bilah tindakan menggunakan tema, maka jendela tidak akan mengizinkan bilah tindakan sama sekali, jadi Anda tidak dapat menambahkannya nanti — memanggil getActionBar () akan mengembalikan nol.

SK9
sumber
11

Saya memiliki masalah yang sama dan salah satu solusi adalah menggunakan setContentView()sebelum menelepongetActionBar() .

Tetapi ada hal lain yang memperbaiki masalah tersebut. Saya menentukan tema aplikasi yang akan dibuat @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>

Saya pikir tema apa pun, yang ada <item name="android:windowActionBar">true</item>di dalamnya, dapat digunakan.

ntoskrnl
sumber
Terima kasih, ini berhasil untuk saya. Dalam kasus saya, metode getActionBar () juga mengembalikan nol dan saya bisa mengatasinya mengubah gaya tema menjadi Theme.Holo.Light. Dengan beberapa tema lain (misalnya Theme.AppCompat), tampaknya ActionBar tidak aktif, sehingga nilainya nol.
harrakiss
10

Alasan utama untuk itu adalah menggunakan tema yang tidak mendukung ActionBar:

Dalam file nyata tambahkan yang berikut ini baik di aktivitas target Anda atau elemen aplikasi (jika Anda ingin menyatukan tema di seluruh aplikasi)

Contoh tema yang mendukung panel tindakan "Theme.AppCompat.Light"atau "Theme.Holo.Light"...

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

Lebih baik untuk meletakkan semua gaya styles.xmldan menggunakannya di mana-mana menggunakan "@style/themName"sehingga yang sebelumnya akan

android:theme="@style/AppTheme"

dan styles.xml akan memiliki yang berikut:

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

Petunjuk:

  • Ada beberapa tema yang tidak dapat digunakan di SDK lama seperti "@android:style/Theme.Holo.Light.DarkActionBar"tidak didukung sebelum SDK versi 14.
  • Untuk memungkinkan aplikasi Anda mendukung versi spesifik SDK minimum, Anda dapat menambahkan <app>elemen di bawah ini :

    <uses-sdk android:minSdkVersion="14" />
  • Untuk menentukan versi min SDK di AndroidStudio, Anda bisa menggunakan file Gradle aplikasi.

    android{
      defaultConfig{
        minSdkVersion 14
        targetSdkVersion 21
      }
    }
Muhammad Soliman
sumber
tapi apa yang saya lakukan untuk mendukung API level 9-13, jika saya menggunakan Theme.Holo.Light.DarkActionBar
Sid
8

Saya mengalami masalah ini. Saya memeriksa nomor versi dan mengaktifkan bilah tindakan hanya jika lebih besar atau sama dengan Honeycomb, tetapi mengembalikan nol. Saya menemukan alasan dan akar penyebabnya adalah saya telah menonaktifkan gaya Tema Holo di style.xml di bawah folder values-v11.

Pratap Singh
sumber
Saya telah menyelesaikan masalah dengan menggunakan Tema Holo sebagai tema induk dari AppTheme saya.
Bharat Dodeja
7

buka AndroidManifest.xml dan ganti

android: theme = "@ style / AppTheme"

by 

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

NEERAJ GUPTA
sumber
6

Gunakan getSupportActionBar () alih-alih getActionBar ()

sonal balekai
sumber
4

Dalam kasus saya, saya memiliki ini dalam kode saya yang tidak berfungsi:

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

    requestWindowFeature(Window.FEATURE_ACTION_BAR);

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
}

Kemudian saya bermain dengan urutan kode:

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

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    context = getApplicationContext();
}

Dan itu berhasil!

Kesimpulan: requestWindowFeature harus menjadi hal pertama yang Anda panggil dalam metode onCreate.

Simon
sumber
3

Saya memiliki masalah yang sama. Itu dipecahkan dengan menyanyikan tema aplikasi di styles.xml

Sebelum

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

Setelah

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

Satu hal yang ingin saya tambahkan karena saya baru saja menemukan ini, jika Anda mencoba untuk mendapatkanActionBar () pada Kegiatan yang memiliki orang tua, itu akan mengembalikan nol. Saya mencoba untuk memperbaiki kode tempat Kegiatan saya terkandung di dalam ActivityGroup, dan butuh beberapa menit bagi saya untuk beralih "oh duh" setelah melihat sumber bagaimana ActionBar dibuat dalam sumber.

C Nick
sumber
dapatkah Anda mengirimkan solusi untuk grup aktivitas?
Anthea
Solusi saya dari apa yang saya ingat adalah saya refactored kode saya untuk tidak menggunakan ActivityGroups. Maaf saya tidak memiliki cuplikan kode :(
C Nick
Ini sebenarnya bukan solutio; lebih banyak komentar. Tapi sangat bermanfaat!
Kato
1

Saya menyelesaikannya dengan perubahan ini:

  1. perubahan minifest android:theme="@android:style/Theme.Holo.Light" >
  2. tambahkan ke kelas extends ActionBarActivity
  3. tambahkan impor ke kelas import android.support.v7.app.ActionBarActivity
Sharon atau Weissberg
sumber
1

Untuk menambah jawaban lain:

Pastikan Anda menelepon setActionBar()atau setSupportActionBar()menggunakan onCreate()metode Anda sebelum memanggil getActionBar():

Tentukan beberapa Bilah Alat di activity.xml Anda, lalu di onCreate ():

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

Saya tahu saya terlambat ke pesta (dan baru di Android) tentang pertanyaan ini, tetapi saya menemukan informasi di sini sangat membantu dan berpikir saya harus menambahkan temuan dari usaha saya sendiri dengan membuat ActionBar bekerja seperti yang saya inginkan jika orang lain seperti saya datang mencari bantuan.

Saya memiliki widget yang merupakan jendela mengambang tanpa judul jendela. Saya menggunakan tema gaya untuk mengimplementasikan android:windowIsFloating, android:backgroundDimEnableddanandroid:windowNoTitle . Widget berfungsi dengan baik sampai saya ingin menambahkan tombol yang disebut pager fragmen dengan beberapa halaman daftar fragmen dan menggunakan ActionBar. Itu akan crash pada aktivitas pager dengan pengecualian pointer nol. Saya mempersempitnya ke ActionBar menjadi nol. Mengikuti temuan orang-orang sebelumnya yang berkontribusi pada utas ini, saya menghapus tema saya dari file manifes dan ActionBar bekerja dengan baik, tetapi sekarang jendela saya sekarang melayang lagi (itu fullscreen) dan memiliki judul halaman yang tidak saya inginkan.

Penelitian lebih lanjut membawa saya ke Panduan Pelatihan Styles and Themes API yang membawa saya ke solusi. Saya menemukan saya dapat menambahkan tema khusus saya ke aktivitas individual di file manifes sedangkan sebelum saya menerapkannya ke aplikasi. Semua jendela saya sekarang memiliki tampilan yang diinginkan.

DocM
sumber
0

Coba perpanjang kelas Aktivitas Anda dari ActionBarActivity. Ini menyelesaikannya untuk saya. Lakukan sesuatu seperti berikut ini:

public class MyActivity extends ActionBarActivity
{
  . . .

Dalam kasus saya, kelas hanya diperluas dari Activity.

Alyoshak
sumber
0

Ini juga dapat membantu beberapa orang.

Dalam kasus saya, itu karena saya belum mendefinisikan konteks di menu.xml

Coba ini:

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

Alih-alih ini:

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

Periksa saja implementasi kode sumber dengan perintah klik:

    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); Memperbaiki masalah saya ketika saya melihat requestWindowFeature (Window.FEATURE_ACTION_BAR) gagal; kode adalah open source, gunakan !!

Ankish Jain
sumber
0

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

bekerja dengan sangat cepat

Akhila Madari
sumber
3
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa memecahkan masalah akan meningkatkan nilai jangka panjang jawaban.
Nic3500
0

Dalam kasus saya, saya hanya perlu memperpanjang AppCompatActivitydaripadaActivity

    supportActionBar?.setDisplayHomeAsUpEnabled(true)

Kelas contoh aktivitas lengkap:

import android.os.Bundle import 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)
    } }

Pada Versi

    minSdkVersion 22
    targetSdkVersion 29
Ayah
sumber