android - getActionBar()возвращает null




android-3.0-honeycomb android-actionbar (19)

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

В методе onCreate моего основного действия я вызываю getActionBar() для настройки моей панели действий. Это отлично работает при работе на эмуляторе Android 3.2, но при использовании Android 3.0 и 3.1 метод getActionBar() возвращает значение null.

Я нахожу это чрезвычайно странным, и я не вижу причин, почему он это сделает. Это ошибка с эмуляторами или есть что-то, что мне нужно сделать, чтобы убедиться, что у моего приложения есть панель действий?

РЕШЕНИЕ: Думаю, я нашел решение этой проблемы. Я не использовал setContentView для установки макета для этой активности. Вместо этого я использовал fragmentTransaction.add(android.R.id.content, mFragment, mTag) чтобы добавить фрагмент к активности. Это отлично работало в 3.2, но в более ранних версиях сотовой панели панель действия, по-видимому, не установлена, если вы не используете setContentView в onCreate() . Поэтому я исправил его с помощью setContentView() в моем onCreate() и просто предоставил ему макет, содержащий пустой FrameLayout. Я все еще могу использовать метод fragmentTransaction.add(android.R.id.content, mFragment, mTag) же, как и раньше.

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


Answers

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

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

requestWindowFeature(Window.FEATURE_ACTION_BAR);

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


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

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


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


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

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

ActionBar нуждается в приложении или теме деятельности, чтобы иметь заголовок приложения. Убедитесь, что вы не указали свое приложение или деятельность как Theme.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" > 

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


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

public class MyActivity extends ActionBarActivity
{
  . . .

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


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

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

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

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

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


  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();

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

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

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

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

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


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

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

by 

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


import android.support.v7.app.AppCompatActivity;

тогда

extends AppCompatActivity

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

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

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

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

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

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

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


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

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

dialog.setCanceledOnTouchOutside(true) 

Устанавливает, отменяется ли это диалоговое окно при касании вне границ окна.





android android-3.0-honeycomb android-actionbar