getActionBar () возвращает ноль


176

У меня странная проблема. Я делаю приложение с targetdk 13.

В методе onCreate моей основной деятельности я вызываю getActionBar()настройку панели действий. Это прекрасно работает при работе на эмуляторе 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. Не думаете ли вы, что указали свою голографическую тему только в папке v13 res? Извините, если это звучит слишком очевидно.
— PJL

Нет, это была моя первая мысль, но это не так. Спасибо за ваш ответ, хотя.
— Кристиан Скогсберг

Ответы:


227

Можно использовать getSupportActionBar()вместо getActionBar()метода.


из всего этого, это сделало это для меня!
— msysmilu

16
спасибо, я использовал "android.support.v7.app.ActionBarActivity", так что это сделал это для меня.
— Вельвал

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()метод возвращает ноль. Я звонил 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

<использует-sdk android: minSdkVersion = "11" /> решил мою проблему спасибо
— Маджид

27

ActionBar нужна тема приложения или действия, чтобы иметь название приложения. Убедитесь, что вы не назвали свое приложение или действие темой. ПРИМЕЧАНИЕ.

<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.
— Вейши Цзэн

Хорошее решение, но для тех, кто его реализует, скорее всего, возникнут ошибки на основе совместимости. Если вам это удалось, убедитесь, что вы проверили свой импорт sa android.support.v4.app.FragmentTransaction, а не просто android.app.FragmentTransaction и android.support.v7.app.ActionBar вместо android.app.ActionBar
— Serj Ardovic

18

Этот ответ запоздал, но может быть полезен всем, кто прибывает из Google: вам, возможно, придется объявить

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

в вашем styles.xml. Кажется, falseможет быть по умолчанию. Вы также должны быть на API 11 или выше.

Более подробную информацию можно найти в документации здесь . В частности, цитата:

Совет: Если у вас есть пользовательская тема действий, в которой вы хотите удалить панель действий, установите для свойства стиля android: windowActionBar значение false. Однако если вы удалите панель действий с помощью темы, то окно вообще не разрешит панель действий, поэтому вы не сможете добавить ее позже - вызов getActionBar () вернет null.


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", они не поддерживаются до версии 14 SDK.
  • Чтобы ваше приложение поддерживало минимальную конкретную версию 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 Theme в style.xml в папке values-v11.


Я решил свою проблему, используя Holo Theme в качестве родительской темы моей AppTheme.
— Бхарат Додея

7

перейдите в AndroidManifest.xml и замените

Android: тема = "@ стиль / AppTheme"

by 

Android: тема = "@ андроид: стиль / 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, у которой есть родитель, она вернет null. Я пытаюсь реорганизовать код, где моя активность содержится в ActivityGroup, и мне потребовалось несколько хороших минут, чтобы сказать «о, черт», после просмотра источника того, как ActionBar создается в исходном коде.


Не могли бы вы опубликовать свое решение для групп деятельности?
— Антея,

Мое решение из того, что я помню, я реорганизовал мой код, чтобы не использовать какие-либо ActivityGroups. Извините, у меня нет фрагментов кода :(
— C Ник

На самом деле это не решение; больше комментариев. Но очень полезно!
— Като

1

Я решаю это с помощью этих изменений:

  1. изменить в минифесте 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, являющегося нулевым. Следуя выводам предыдущих людей, которые внесли свой вклад в эту тему, я удалил свою тему из файла манифеста, и панель действий работала нормально, но теперь мое окно теперь больше не перемещалось (оно было полноэкранным), и у него было название страницы, которое я не хотел.

Дальнейшие исследования привели меня к Руководству по API стилей и тем, которое привело меня к решению. Я обнаружил, что могу добавить свою пользовательскую тему к отдельным действиям в файле манифеста, тогда как раньше я применял ее к приложению. Все мои окна теперь имеют желаемый вид.


0

Попробуйте расширить класс Activity из ActionBarActivity. Это решило это для меня. Сделайте что-то вроде следующего:

public class MyActivity extends ActionBarActivity
{
  . . .

В моем случае класс расширялся только от Activity.


0

Это также может помочь некоторым людям.

В моем случае это было потому, что я не определил контекст в menu.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

Просто проверьте реализацию исходного кода командой click:

    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) не работает; код с открытым исходным кодом, используйте его!


0

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

работает довольно быстро


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

0

В моем случае мне просто пришлось расширить AppCompatActivityвместоActivity

    supportActionBar?.setDisplayHomeAsUpEnabled(true)

Полный пример занятий:

импорт android.os. импорт импорта 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.