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.