it-swarm.com.ru

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

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

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

169
Christian Skogsberg

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

208
Amir

Если вы используете библиотеку поддержки

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
46
Elenasys

Вы должны определить тип окна как панель действий перед тем, как активность отобразит ее вид.

использование 

requestWindowFeature(Window.FEATURE_ACTION_BAR);

перед вызовом метода setContentView ().

33
kaushal trivedi

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

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

31
Rajendra
  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();
31
Hitesh Sahu

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" > 
27
Himanshu Virmani

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

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

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

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

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

18
SK9
import Android.support.v7.app.AppCompatActivity;

затем

extends AppCompatActivity

затем используйте

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
18
Abilash Rajasekaran

Основной причиной этого является использование тем, которые не поддерживают 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
      }
    }
    
10
msoliman

У меня была та же проблема, и одним из решений было использование 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>, может быть использована.

10
ntoskrnl

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

8
Pratap Singh

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

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

by 

Android: тема = "@ Android: стиль/Theme.Holo.Light.DarkActionBar" 

7
NEERAJ GUPTA

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

5
sonal balekai

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

@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.

4
Simon

Я была такая же проблема. Это решается путем изменения темы приложения в 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">
3
jafarmlp

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

2
C Nick

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

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

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

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

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

public class MyActivity extends ActionBarActivity
{
  . . .

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

0
Alyoshak

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

Убедитесь, что вы вызываете 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
A-Sharabiani

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

У меня есть виджет, который является плавающим окном без заголовка окна. Я использую тему стиля для реализации Android:windowIsFloating, Android:backgroundDimEnabled и Android:windowNoTitle. Виджет работал нормально, пока я не хотел добавить кнопку, которая назвала фрагментный пейджер с несколькими страницами фрагмента списка и использовал ActionBar. Это может привести к падению активности пейджера с исключением нулевого указателя. Я сузил это до ActionBar, являющегося нулевым. Следуя выводам предыдущих людей, которые внесли свой вклад в эту тему, я удалил свою тему из файла манифеста, и ActionBar работал нормально, но теперь мое окно теперь больше не перемещалось (оно было полноэкранным), и у него был заголовок страницы, который я не хотел.

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

0
DocM

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

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

0
Akhila Madari

Просто проверьте реализацию исходного кода командой 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
Ankish Jain