web-dev-qa-db-ja.com

getActionBar()はnullを返します

私は奇妙な問題を抱えています。私はtargetsdk 13でアプリを作っています。

メインアクティビティのonCreateメソッドで、getActionBar()を呼び出してアクションバーをセットアップします。これはAndroid 3.2エミュレーターで実行する場合は正常に機能しますが、Android 3.0および3.1を使用する場合はgetActionBar()メソッドはnullを返します。

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

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

最もきれいな修正方法ではありませんが、機能します。

171

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

211
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
  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();
32
Hitesh Sahu

getActionBar()メソッドがnullを返す上記の問題に直面しました。 getActionBar()を設定した後、nullを返した後、setContentView()を呼び出していました。

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

31
Rajendra

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" > 
27
import Android.support.v7.app.AppCompatActivity;

それから

extends AppCompatActivity

次に使用する

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
19

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

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

styles.xmlで。 falseがデフォルトになる可能性があります。また、API 11以降を使用する必要があります。

詳細については、ドキュメントを参照してください here 。具体的には、引用:

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

18
SK9

その主な理由は、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
      }
    }
    
10
msoliman

私は同じ問題を抱えていましたが、解決策の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>を含むすべてのテーマを使用できると思います。

10
ntoskrnl

私はこの問題に出くわしました。バージョン番号を確認し、Honeycomb以上の場合にのみアクションバーを有効にしましたが、nullを返していました。その理由と根本原因は、values-v11フォルダーの下のstyle.xmlでHolo Themeスタイルを無効にしたことでした。

8
Pratap Singh

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

Android:theme = "@ style/AppTheme"

by 

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

7
NEERAJ GUPTA

GetActionBar()の代わりにgetSupportActionBar()を使用します

6
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でAppテーマを変更することで解決しました

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

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

2
C Nick

この変更により解決します。

  1. ミニフェストの変更Android:theme="@Android:style/Theme.Holo.Light" >
  2. クラスに追加extends ActionBarActivity
  3. クラスimport Android.support.v7.app.ActionBarActivityにインポートを追加します
1

私の場合、私は単に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
0
DaddyMoe

これは一部の人々にも役立つかもしれません。

私の場合、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

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

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

さらなる研究により、私は Styles and Themes API Training Guide に導かれ、それが解決策につながりました。アプリケーションに適用する前に、カスタムテーマをマニフェストファイルの個々のアクティビティに追加できることを発見しました。これで、すべてのウィンドウが目的の外観になりました。

0
DocM

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

かなり速く動作します

0
Akhila Madari

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

    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