getActionBar () повертає null


176

У мене є дивна проблема. Я роблю додаток із targetdk 13.

У моїй основній діяльності метод onCreate я дзвоню getActionBar() onCreate налаштувати панель дій. Це добре працює під час роботи на емуляторі Android 3.2, але при використанні Android 3.0 та 3.1 getActionBar()метод повертає нуль.

Я вважаю це надзвичайно дивним, і я не бачу жодної причини, чому це зробить так. Це помилка з емуляторами чи мені щось потрібно зробити для того, щоб у моєму додатку була панель дій?

РІШЕННЯ: Я думаю, що я знайшов рішення для цієї проблеми. Я не використовував setContentView для встановлення плану для діяльності. Натомість я використовував, fragmentTransaction.add(android.R.id.content, mFragment, mTag)щоб додати фрагмент до активності. Це спрацювало чудово в 3.2, але в попередніх версіях сотових панелей, очевидно, не встановлено панель дій, якщо ви не використовуєте setContentView у onCreate()методі. Тому я виправив його, використовуючи setContentView()метод у своєму onCreate()методі та просто надавши йому макет, який містив порожній FrameLayout. Я все ще можу використовувати fragmentTransaction.add(android.R.id.content, mFragment, mTag)метод так само, як і раніше.

Це не найкрасивіше виправлення, але воно працює.


як ви вказали, відповідаючи на інший пост, вам потрібна тема Holo. Не припускайте, що ви вказали свою тему holo лише у папці v13 res? Вибачте, якщо це звучить занадто очевидно.
— PJL

Ні, це теж була моя перша думка, але це не так. Дякую за вашу відповідь.
— Крістіан Скогсберг

Відповіді:


226

Можна використовувати getSupportActionBar()замість getActionBar()методу.


звідси, це зробив це для мене!
— msysmilu

16
дякую, я використовував "android.support.v7.app.ActionBarActivity", тому це зробило це для мене.
— velval

1
Через 2 години пошуку! Змінення на getSupportActionBar () та android.support.v7.app.ActionBarActivity остаточно виправляє це для мене.
— FacePalm

Це вирішення проблеми.
— зигімантус

46

Якщо ви використовуєте бібліотеку підтримки

import android.support.v7.app.ActionBarActivity;

public class MainActivity extends ActionBarActivity {

використання getSupportActionBar() замістьgetActionBar()

* Оновлення:

Клас ActionBarActivity тепер застарілий:

import android.support.v7.app.ActionBarActivity;

Рекомендую використовувати:

import android.support.v7.app.AppCompatActivity

в межах android.support.v7.app: ActionBarActivityзастаріле використання android.support.v7.app.AppCompatActivity.
— А. Петров

35

Ви повинні визначити тип вікна як панель дій, перш ніж діяльність відобразить його подання.

використання

requestWindowFeature(Window.FEATURE_ACTION_BAR);

перед викликом методу setContentView ().


Якщо getSupportActionBar () не працює, це працює як принадність
— Ешвін Балані

35
  1. якщо ви використовуєте android.support.v7.app.AppCompatActivity

    HomeActivity публічного класу розширює AppCompatActivity {

Тоді вам слід використовувати android.support.v7.app.ActionBar

  ActionBar ab = getSupportActionBar();
  1. Якщо ви використовуєте android.support.v4.app.FragmentActivity

    HomeActivity публічного класу розширює FragmentActivity {

тоді вам слід використовувати android.app.ActionBar

    ActionBar ab = getActionBar();
  1. Якщо ви використовуєте android.support.v7.app.ActionBarActivity

    HomeActivity публічного класу розширює ActionBarActivity {

ви повинні використовувати android.support.v7.app.ActionBar

   ActionBar ab = getSupportActionBar();

Прекрасна відповідь, вирішує плутанину !!
— sud007

31

Я зіткнувся з вищезазначеною проблемою, де getActionBar()метод повертає null. Я дзвонив getActionBar()після встановлення setContentView()і досі його поверненняnull .

Я вирішив проблему, встановивши версію min-sdk у файлі Android Manifest, який відсутній спочатку. <uses-sdk android:minSdkVersion="11" />


4
Це врятувало мені стільки часу! Усі, хто використовує приклад Bluetooth Chat в Android SDK, повинні використовувати це виправлення. Маніфест програми нехтує включенням простору імен "android:" у свій тег minSdkVersion, тому він не реєструється. Додавання простору імен виправляє помилку, оскільки панель дій не знайдена. Недбало, Google!
— Нік

Насправді вам може знадобитися лише вказати targetSdkVersion. Ви можете запустити з нижчим minSdkVersion, якщо ви використовуєте бібліотеку compat, але targetSdkVersion визначає поведінку.
— Вільям

Чудово !! це те, що я шукав.
— swiftBoy

<use-sdk android: minSdkVersion = "11" /> вирішив мою проблему спасибі
— Majid

27

ActionBar потребує теми програми або теми, щоб мати назву програми. Переконайтеся, що ви не оформили свою програму чи діяльність як Тема.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" > 

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

тоді

extends AppCompatActivity

потім використовуйте

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

виправляє мою проблему в прикладі ящика навігації Google.
— Weishi Zeng

Хороше рішення, але для тих, хто його буде реалізовувати, швидше за все, з’являться помилки на основі сумісності. Якщо ви це зробите, переконайтесь, що перевіряйте імпорт sa android.support.v4.app.FragmentTransaction, а не просто android.app.FragmentTransaction та android.support.v7.app.ActionBar замість android.app.ActionBar
— Serj Ардович

18

Ця відповідь пізня, але може бути корисною для всіх, хто приїжджає з Google: Можливо, вам потрібно буде заявити

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

у вашому styles.xml. Здається, це falseможе бути за замовчуванням. Вам також потрібно бути на API 11 або вище.

Більш детальну інформацію ви можете знайти в документації тут . Зокрема, цитуйте:

Порада: Якщо у вас є власна тема діяльності, з якої ви хочете видалити рядок дій, встановіть властивість стилю android: windowActionBar на значення false. Однак якщо ви видалите панель дій за допомогою теми, вікно взагалі не дозволить панелі дій, тому ви не зможете її додати пізніше - виклик getActionBar () повернеться в нулеве значення.


11

У мене була така ж проблема, і одне з рішень було використовувати setContentView()перед викликом getActionBar().

Але була ще одна річ, яка вирішила проблему. Я вказав тему для програми @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>

Я думаю, будь-яка тема, яка є <item name="android:windowActionBar">true</item>в ній, може бути використана.


Дякую, це працює на мене. У моєму випадку метод getActionBar () також повернувся до нуля, і я міг вирішити це, змінивши стиль теми на Theme.Holo.Light. З деякими іншими темами (наприклад, Theme.AppCompat), здається, що ActionBar не активний, тому його значення є нульовим.
— harrakiss

10

Основна причина цього - використання тем, які не підтримують ActionBar:

У файл маніфесту додайте наступне або в цільовій діяльності або в додатку (якщо ви хочете об'єднати тему з усією програмою)

Приклади тем, які підтримують панель дій "Theme.AppCompat.Light"чи "Theme.Holo.Light"...

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

Краще розмістити всі стилі styles.xmlта використовувати його скрізь, використовуючи "@style/themName"попередній

android:theme="@style/AppTheme"

і styles.xml матиме наступне:

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

Підказки:

  • Є деякі теми, які не можна використовувати в старих SDK, як, наприклад "@android:style/Theme.Holo.Light.DarkActionBar", не підтримується до SDK версії 14.
  • Щоб ваш додаток підтримував мінімальну конкретну версію SDK, ви можете додати наступне під <app>елементом:

    <uses-sdk android:minSdkVersion="14" />
  • Щоб вказати мінімальну версію SDK в AndroidStudio, ви можете скористатися файлом Gradle програми.

    android{
      defaultConfig{
        minSdkVersion 14
        targetSdkVersion 21
      }
    }

але що мені робити для підтримки API рівня 9-13, якщо я використовую Theme.Holo.Light.DarkActionBar
— Sid

8

Я зіткнувся з цією проблемою. Я перевіряв номер версії та вмикав панель дій, лише якщо вона більша або дорівнює Honeycomb, але вона повертається до нуля. Я знайшов причину і першопричину в тому, що я відключив стиль теми Holo у style.xml у папці значень-v11.


Я вирішив свою проблему, використовуючи тему Holo як основну тему своєї програми AppTheme.
— Бхарат Додея

7

перейдіть на AndroidManifest.xml та замініть

android: topic = "@ style / AppTheme"

by 

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



4

У моєму випадку я мав це у своєму коді, який не працював:

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

    requestWindowFeature(Window.FEATURE_ACTION_BAR);

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
}

Потім я грав із порядком коду:

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

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    context = getApplicationContext();
}

І це спрацювало!

Висновок: requestWindowFeature має бути першим, що ви викликаєте у методі onCreate.


3

У мене було те саме питання. Це вирішено шляхом зміни теми програми в styles.xml

До цього

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

Після

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

2

Одне, що я хотів додати, оскільки я щойно зіткнувся з цим, якщо ви намагаєтесь отримати getActionBar () у діяльності, у якої є батько, він повернеться в нулеве значення. Я намагаюся змінити код рефактора, де моя активність міститься в групі Activity, і мені знадобилося кілька хвилин, щоб я перейшов "ой так", подивившись на джерело того, як створюється ActionBar у джерелі.


Ви можете опублікувати рішення для груп активності?
— Антея

Моє рішення з того, що я пам’ятаю, це те, що я відновив свій код, щоб не використовувати жодних груп груп Activity. Вибачте, у мене немає фрагментів коду :(
— C Nick

Це насправді не рішення; більше коментаря. Але дуже корисно!
— Като

1

Я вирішую це завдяки цим змінам:

  1. зміна в minifest android:theme="@android:style/Theme.Holo.Light" >
  2. додати до класу extends ActionBarActivity
  3. додати імпорт до класу import android.support.v7.app.ActionBarActivity

1

Щоб додати до інших відповідей:

Переконайтеся, що ви телефонуєте setActionBar()або setSupportActionBar()у своєму onCreate()способі, перш ніж викликати getActionBar():

Визначте деяку Панель інструментів у Activity.xml, а потім у onCreate ():

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

0

Я знаю, що я запізнююсь на вечірку (і новачок в Android) з цього питання, але мені ця інформація виявилася дуже корисною, і думав, що слід додати висновки моїх власних зусиль із залученням ActionBar до роботи, як я хотів, у випадку, якщо приходять інші, як я. шукає допомоги.

У мене є віджет, який є плаваючим вікном без назви вікна. Я використовую тему стилів для реалізації android:windowIsFloating, android:backgroundDimEnabledіandroid:windowNoTitle . Віджет працював чудово, поки я не хотів додати кнопку, яка називала пейджер фрагмента з кількома сторінками фрагмента списку та не використовував ActionBar. Він завершиться тимчасовою активністю пейджера з виключенням нульового вказівника. Я звузив його до пункту ActionBar, який є нульовим. Після висновків попередніх людей, які внесли свій внесок у цю тему, я видалив свою тему з файлу маніфесту, і ActionBar працював нормально, але тепер моє вікно тепер більше плавало (це було повноекранним), і в ньому була назва сторінки, яку я не хотів.

Подальші дослідження відвели мене до Посібника з навчальних програм « Стилі та теми», який привів мене до рішення. Я виявив, що можу додати свою власну тему до окремих дій у файлі маніфесту, тоді як до того, як я застосував її до програми. Усі мої вікна зараз мають бажаний вигляд.


0

Спробуйте розширити клас активності від ActionBarActivity. Це вирішило це для мене. Зробіть щось подібне:

public class MyActivity extends ActionBarActivity
{
  . . .

У моєму випадку клас поширювався лише з діяльності.


0

Це також може допомогти деяким людям.

У моєму випадку це було тому, що я не визначив контекст у меню.xml

Спробуйте це:

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

Замість цього:

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

0

Просто перевірте реалізацію вихідного коду, натиснувши команду:

    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); Виправлена ​​проблема, коли я побачив, що запитWWFFeature (Window.FEATURE_ACTION_BAR) не працює; код з відкритим кодом використовуйте його !!


0

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

працює досить швидко


3
Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, як та / або чому він вирішує проблему, покращить довгострокове значення відповіді.
— Nic3500

0

У моєму випадку я просто повинен був продовжити AppCompatActivityзамість цьогоActivity

    supportActionBar?.setDisplayHomeAsUpEnabled(true)

Приклад класу повної активності:

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

Про версії

    minSdkVersion 22
    targetSdkVersion 29
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.