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.