getActionBar () возвращает ноль - PullRequest
171 голосов
/ 29 июля 2011

У меня странная проблема. Я делаю приложение с 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) так же, как и раньше.

Это не самое красивое исправление, но оно работает.

Ответы [ 24 ]

8 голосов
/ 08 апреля 2013

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

7 голосов
/ 29 января 2016

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

android: theme = "@ style / AppTheme"

by 

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

6 голосов
/ 28 марта 2018

Используйте getSupportActionBar () вместо getActionBar ()

4 голосов
/ 21 марта 2015

В моем случае это было в моем коде, которое не работало:

@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 голосов
/ 26 октября 2017

У меня была такая же проблема.Это решено изменением темы приложения в 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 голосов
/ 28 февраля 2012

Одна вещь, которую я хотел бы добавить, так как я только что натолкнулся на это, если вы пытаетесь вызвать getActionBar () для Activity, у которой есть родитель, она вернет null.Я пытаюсь реорганизовать код, в котором моя активность содержится в ActivityGroup, и мне потребовалось несколько минут, чтобы сказать «о, черт», после того, как я посмотрел на источник создания ActionBar в исходном коде.

1 голос
/ 29 октября 2015

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

  1. изменение минифеста android:theme="@android:style/Theme.Holo.Light" >
  2. добавить в класс extends ActionBarActivity
  3. добавить импорт в класс import android.support.v7.app.ActionBarActivity
0 голосов
/ 18 марта 2018

Чтобы добавить к другим ответам:

Убедитесь, что вы вызываете 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 голосов
/ 17 декабря 2014

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

public class MyActivity extends ActionBarActivity
{
  . . .

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

0 голосов
/ 24 февраля 2015

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

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