getActionBar()はnullを返します


176

奇妙な問題が発生しています。私はtargetsdk 13でアプリを作っています。

メインアクティビティのonCreateメソッドでgetActionBar()、アクションバーを設定するために呼び出します。これは、Android 3.2エミュレータで実行すると問題なく機能しますが、Android 3.0および3.1を使用するとgetActionBar()メソッドはnullを返します。

私はこれを非常に奇妙に思います、そしてそれがそうする理由を私は見ることができません。これはエミュレータのバグですか、それともアプリケーションにアクションバーがあることを確認するために何かする必要がありますか?

SOLUTION: 私はこの問題の解決策を見つけたと思います。アクティビティのレイアウトを設定するためにsetContentViewを使用していませんでした。代わりにfragmentTransaction.add(android.R.id.content, mFragment, mTag)、アクティビティにフラグメントを追加するために使用していました。これは3.2では問題なく機能しましたが、以前のハニカムバージョンでは、onCreate()メソッドでsetContentViewを使用しない場合、アクションバーは設定されないようです。したがって、setContentView()メソッドでメソッドを使用しonCreate()、空のFrameLayoutを含むレイアウトを提供するだけで修正しました。私はまだ使用できますfragmentTransaction.add(android.R.id.content, mFragment, mTag)方法は以前と同じようにます。

それは最もきれいな修正ではありませんが、動作します。


別の投稿への回答で指摘したように、Holoテーマが必要です。ホロテーマをv13のresフォルダーのみで指定したと思いませんか?それがあまりにも明白に聞こえる場合は申し訳ありません。
PJL 2011

いいえ、それも私の最初の考えでしたが、そうではありません。返信ありがとうございます。
Christian Skogsberg、2011

回答:


226

メソッドのgetSupportActionBar()代わりに使用できますgetActionBar()


ここから、これは私のためにそれをやった!
msysmilu 2015年

16
おかげで、私は「android.support.v7.app.ActionBarActivity」を使用していたので、これは私のためにそれをしました。
velval、2015年

1
2時間の検索後!getSupportActionBar()とandroid.support.v7.app.ActionBarActivityに変更すると、最終的に修正されます。
FacePalm

これが問題の解決策です。
zygimantus

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

within android.support.v7.appActionBarActivity非推奨android.support.v7.app.AppCompatActivity代わりに使用してください。
A.ペトロフ2015

35

アクティビティがビューをレンダリングする前に、ウィンドウタイプをアクションバーとして定義する必要があります。

使用する

requestWindowFeature(Window.FEATURE_ACTION_BAR);

setContentView()メソッドを呼び出す前。


getSupportActionBar()が機能しない場合、これは魅力的なように機能します
Ashwin Balani

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 2016

31

getActionBar()メソッドがnullを返すという上記の問題に直面しました。私はをgetActionBar()設定した後に呼び出していましたがsetContentView()、それでも戻りますnull

最初に見つからなかったAndroidマニフェストファイルにmin-sdkバージョンを設定することで問題を解決しました。 <uses-sdk android:minSdkVersion="11" />


4
これで時間を大幅に節約できました。Android SDKでBluetoothチャットサンプルアプリを使用している場合は、この修正を使用する必要があります。アプリのマニフェストは、minSdkVersionタグに「android:」名前空間を含めることを無視しているため、登録されません。名前空間を追加すると、アクションバーが見つからないというエラーが修正されます。ずさんな、グーグル!
Nick

実際には、targetSdkVersionを指定する必要があるだけかもしれません。compatライブラリを使用している場合は、minSdkVersionを低くして実行できますが、targetSdkVersionが動作を決定します。
ウィリアム

すごい!!これは私が探していたものです。
swiftBoy 2014

<uses-sdk android:minSdkVersion = "11" />おかげで私の問題が解決しました
Majid

27

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" > 

19
import android.support.v7.app.AppCompatActivity;

その後

extends AppCompatActivity

次に使用します

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

グーグルのナビゲーションドロワーの例で私の問題を修正しました。
Weishi Zeng 2016

良い解決策ですが、それを実装する人にとっては、おそらく互換性ベースのエラーが発生します。その場合は、必ずandroid.app.FragmentTransactionの代わりにandroid.support.v4.app.FragmentTransactionをチェックし、android.app.ActionBarの代わりにandroid.support.v7.app.ActionBarをチェックしてください
Serj Ardovic

18

この回答は遅れていますが、Googleから到着した人には役立つかもしれません:宣言する必要があるかもしれません

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

あなたのstyles.xmlfalseデフォルトのようです。また、API 11以降を使用している必要があります。

詳細については、こちらのドキュメントをご覧ください。具体的には、引用:

ヒント:アクションバーを削除するカスタムアクティビティテーマがある場合は、android:windowActionBarスタイルプロパティをfalseに設定します。ただし、テーマを使用してアクションバーを削除すると、ウィンドウではアクションバーがまったく許可されないため、後で追加することはできません。getActionBar()を呼び出すとnullが返されます。


11

同じ問題があり、解決策の1つは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()メソッドもnullを返し、テーマスタイルをTheme.Holo.Lightに変更することで解決できました。その他のテーマ(Theme.AppCompatなど)では、ActionBarがアクティブでないように見えるため、その値はnullです。
harrakiss 2014

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">

ヒント:

  • "@android:style/Theme.Holo.Light.DarkActionBar"SDKバージョン14より前ではサポートされていないなど、古いSDKで使用できないテーマがいくつかあります。
  • アプリが特定のバージョンのSDKをサポートできるようにするには、以下の<app>要素を追加します。

    <uses-sdk android:minSdkVersion="14" />
  • AndroidStudioで最小SDKバージョンを指定するには、アプリのGradleファイルを使用できます。

    android{
      defaultConfig{
        minSdkVersion 14
        targetSdkVersion 21
      }
    }

しかし、Theme.Holo.Light.DarkActionBarを使用する場合、APIレベル9〜13をサポートするにはどうすればよいですか
Sid

8

この問題に遭遇しました。バージョン番号をチェックして、それがHoneycomb以上の場合にのみアクションバーを有効にしていましたが、nullを返していました。理由と根本的な原因は、values-v11フォルダーの下のstyle.xmlでHoloテーマスタイルを無効にしたことでした。


HoloテーマをAppThemeの親テーマとして使用することで問題を解決しました。
Bharat Dodeja 2015年

7

AndroidManifest.xmlに移動して置き換えます

android:theme = "@ style / AppTheme"

by 

android:theme = "@ android:style / 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のAppテーマを変更することで解決しました

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

<!-- Base application theme. -->
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">

2

これに遭遇したばかりなので、追加したいことが1つあります。親を持つアクティビティでgetActionBar()を実行しようとすると、nullが返されます。アクティビティがActivityGroup内に含まれているコードをリファクタリングしようとしていますが、ソースでActionBarが作成される方法のソースを確認した後、「ああ、そう」行くのに数分かかりました。


活動グループのためのソリューションを投稿できますか?
Anthea

私が覚えていることからの私の解決策は、ActivityGroupsを使用しないようにコードをリファクタリングしたことです。すみません、コードスニペットはありません:(
C Nick

これは実際には解決策ではありません。コメントの詳細。しかし、とても便利です!
加藤

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:windowIsFloatingandroid:backgroundDimEnabledかつandroid:windowNoTitleます。ウィジェットは、いくつかのリストフラグメントページを持つフラグメントページャーを呼び出し、ActionBarを使用するボタンを追加するまで問題なく機能しました。nullポインタ例外により、ページャアクティビティでクラッシュしました。ActionBarがnullになるように絞り込みました。このスレッドに貢献した以前の人々の調査結果に続いて、マニフェストファイルからテーマを削除し、ActionBarは正常に機能しましたが、ウィンドウがフロート状態になり(フルスクリーン)、ページタイトルが不要になりました。

さらに調査を行った結果、スタイルとテーマのAPIトレーニングガイドが表示され、解決策が見つかりました。アプリケーションに適用する前に、マニフェストファイルの個々のアクティビティにカスタムテーマを追加できることがわかりました。これで、すべてのウィンドウが望ましい外観になります。


0

ActionBarActivityからActivityクラスを拡張してみてください。これで解決しました。次のようなことをしてください:

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

コマンドクリックでソースコードの実装を確認するだけです:

    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 2018

0

私の場合、AppCompatActivity代わりに延長する必要がありましたActivity

    supportActionBar?.setDisplayHomeAsUpEnabled(true)

完全なアクティビティの例のクラス:

import android.os.Bundle import 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.