getActionBar ()는 null을 반환


176

이상한 문제가 있습니다. 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)이전과 같은 방법을 사용할 수 있습니다 .

가장 예쁜 수정은 아니지만 작동합니다.


다른 게시물에 답할 때 Holo 테마가 필요합니다. v13 res 폴더에만 홀로 테마를 지정했다고 가정하지 않습니까? 너무 분명하게 들리면 죄송합니다.
PJL

아니요, 저도 처음 생각했지만 그렇지 않습니다. 답장을 보내 주셔서 감사합니다.
Christian Skogsberg

답변:


226

방법 getSupportActionBar()대신 사용할 수 있습니다 getActionBar().


여기에서, 이것은 나를 위해 그것을했다!
msysmilu

16
감사합니다, 나는 "android.support.v7.app.ActionBarActivity"를 사용하고 있었으므로 이것이 나를 위해했습니다.
velval

1
검색 2 시간 후! getSupportActionBar () 및 android.support.v7.app.ActionBarActivity로 변경하면 마침내 수정됩니다.
FacePalm

이것이 문제에 대한 해결책입니다.
zygimantus 2016 년

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.app: ActionBarActivity사용되지 않음 android.support.v7.app.AppCompatActivity대신 사용하십시오 .
A. Petrov

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

31

getActionBar()메소드가 null을 반환 하는 위의 문제에 직면했습니다 . 나는를 getActionBar()설정 한 setContentView()후에도 여전히 호출하고 있었다 null.

처음에 누락 된 Android Manifest 파일에서 min-sdk 버전을 설정하여 문제를 해결했습니다. <uses-sdk android:minSdkVersion="11" />


4
이로 인해 많은 시간이 절약되었습니다! Android SDK에서 Bluetooth Chat 예제 앱을 사용하는 사람은이 수정 프로그램을 사용해야합니다. 앱의 매니페스트는 minSdkVersion 태그에 "android :"네임 스페이스를 포함하지 않으므로 등록하지 않습니다. 네임 스페이스를 추가하면 작업 표시 줄을 찾을 수없는 오류가 수정됩니다. 조잡 해, 구글!
Nick

실제로 targetSdkVersion을 지정해야 할 수도 있습니다. compat 라이브러리를 사용하는 경우 더 낮은 minSdkVersion으로 실행할 수 있지만 targetSdkVersion은 동작을 결정합니다.
William

큰!! 이것이 내가 찾던 것입니다.
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);

Google의 탐색 서랍 예제에서 내 문제를 해결합니다.
Weishi Zeng

좋은 솔루션이지만 구현하려는 사람들에게는 호환성 기반 오류가 발생합니다. 그렇게한다면 android.app.FragmentTransaction 대신 android.app.ActionBar
Serj

18

답변이 늦었지만 Google에서 오는 모든 사람에게 도움이 될 수 있습니다. 신고해야 할 수도 있습니다.

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

당신의 styles.xml. 보인다 false기본이 될 수 있습니다. 또한 API 11 이상이어야합니다.

자세한 내용은 여기 의 설명서를 참조하십시오 . 구체적으로 다음과 같이 인용하십시오.

팁 : 작업 표시 줄을 제거하려는 사용자 정의 활동 테마가있는 경우 android : windowActionBar 스타일 특성을 false로 설정하십시오. 그러나 테마를 사용하여 작업 표시 줄을 제거하면 창에 작업 표시 줄이 전혀 허용되지 않으므로 나중에 추가 할 수 없으므로 getActionBar ()를 호출하면 null이 반환됩니다.


11

나는 같은 문제가 있었고 해결책 중 하나는 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

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
Sid

8

나는이 문제에 부딪쳤다. 버전 번호를 확인하고 Honeycomb 이상인 경우에만 작업 표시 줄을 활성화했지만 null을 반환했습니다. 그 이유와 근본 원인은 values-v11 폴더의 style.xml에서 Holo Theme 스타일을 비활성화했기 때문입니다.


Holo Theme를 AppTheme의 부모 테마로 사용하여 문제를 해결했습니다.
Bharat Dodeja

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에서 앱 테마를 노래로 해결했습니다.

전에

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

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

2

부모님이있는 Activity에서 getActionBar ()를 얻으려고하면 null을 반환합니다. ActivityGroup 내부에 Activity가 포함되어있는 코드를 리팩터링하려고하는데 ActionBar가 소스에서 생성되는 방식을 살펴본 후 "oh duh"로 이동하는 데 몇 분이 걸렸습니다.


활동 그룹에 대한 솔루션을 게시 할 수 있습니까?
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:windowIsFloating, android:backgroundDimEnabledandroid:windowNoTitle . 위젯은 여러 목록 조각 페이지가있는 조각 호출기라는 버튼을 추가하고 ActionBar를 사용하기 전까지 정상적으로 작동했습니다. 널 포인터 예외로 인해 호출기 활동에서 충돌이 발생합니다. ActionBar로 null로 좁혔습니다. 이 스레드에 기여한 이전 사람들의 발견에 따라 매니페스트 파일에서 테마를 제거하고 ActionBar가 정상적으로 작동했지만 이제는 내 창이 더 이상 떠 다니고 (전체 화면 임) 원하지 않는 페이지 제목이있었습니다.

추가 연구를 통해 Styles and Themes 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

0

내 경우에는 단순히 AppCompatActivity대신 확장해야했습니다.Activity

    supportActionBar?.setDisplayHomeAsUpEnabled(true)

전체 활동 예제 클래스 :

import android.os. 번들 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.