Android 오류 [null 개체 참조에서 가상 메서드 'void android.app.ActionBar'호출 시도]


97

탐색 서랍이있는 viewpager를 구현하는 코드 모듈이 있지만 코드를 실행하면 다음 오류가 발생합니다.

01-26 09:20:02.958: D/AndroidRuntime(18779): Shutting down VM
01-26 09:20:02.959: E/AndroidRuntime(18779): FATAL EXCEPTION: main
01-26 09:20:02.959: E/AndroidRuntime(18779): Process: com.example.tabwithslidingdrawer, PID: 18779
01-26 09:20:02.959: E/AndroidRuntime(18779): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.tabwithslidingdrawer/com.example.tabwithslidingdrawer.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)' on a null object reference
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2314)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2388)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.ActivityThread.access$800(ActivityThread.java:148)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.os.Handler.dispatchMessage(Handler.java:102)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.os.Looper.loop(Looper.java:135)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.ActivityThread.main(ActivityThread.java:5312)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at java.lang.reflect.Method.invoke(Native Method)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at java.lang.reflect.Method.invoke(Method.java:372)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
01-26 09:20:02.959: E/AndroidRuntime(18779): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)' on a null object reference
01-26 09:20:02.959: E/AndroidRuntime(18779):    at com.example.tabwithslidingdrawer.MainActivity.onCreate(MainActivity.java:95)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.Activity.performCreate(Activity.java:5953)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1128)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2267)
01-26 09:20:02.959: E/AndroidRuntime(18779):    ... 10 more
09:20:02.959: E/AndroidRuntime(18779): Caused by:
java.lang.NullPointerException: Attempt to invoke virtual method 'void
android.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)' on a null
object reference 01-26 09:20:02.959: E/AndroidRuntime(18779):     at
com.example.tabwithslidingdrawer.MainActivity.onCreate(MainActivity.java:95)

이 선을 가리킨다

// enabling action bar app icon and behaving it as a toggle button
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

전체 코드 http://pastebin.com/u1K72fr7

내 매니페스트

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.tabwithslidingdrawer"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.Tabwithpager" >
        <activity
            android:name="com.example.tabwithslidingdrawer.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

android : theme = "@ style / Theme.Tabwithpager"

코드 http://pastebin.com/EFQLzRej

================================================ ================ 편집 / 업데이트 :

이것에서 배운 것

이러한 오류가 발생할 때마다

1. 어떤 종류의 Activity가 사용되고 있는지, 간단한 android.app Activity인지 AppCompatActivity 또는 ActionBarActivity 등인지 확인합니다.

2. 연장 된 활동 유형이 compat 카테고리에 속하는지 확인하십시오.

예제 android.app 기반 Activity / Fragment는 appCompat 유형이 아닌 반면 android.support.v4.app.Fragment 또는 android.support.v4.app.ActivityCompat는 appCompat 기반입니다.

appCompat에 속하면 getSupportActionBar ()를 사용하고 android.app 유형에는 getActionBar ()를 사용할 수 있습니다.

3. 매니페스트 파일에서 해당 활동에 적용된 테마를 확인합니다.

예 : 매니페스트 파일에서 테마가 적용된 경우 android : theme = "@ android : style / Theme.Holo.Dialog"getActionBar ()가 작동합니다.

그러나 매니페스트의 활동에 적용된 테마가 android : theme = "@ style / Theme.AppCompat.Light"와 같으면 getSupportActionBar ()를 사용해야합니다.


3
디 시도 getSupportActionbar()?
Kingfisher Phuoc 2015 년

난 이미 내 코드에 getSupportActionbar를 사용하고
ViVekH

앱 호환 테마를 사용하셨습니까? 추가 도움이 필요하면 활동 선언과 함께 매니페스트를 여기에 게시해야합니다.
Kingfisher Phuoc

코드를 다시 봐야합니다. 나는 supportActionBar당신의 테마로 (null이 아님) 얻을 수 있습니다 . 모두 getActionBar로 바꾸 셨나요 getSupportActionBar? 한 가지 더, 새 오류 로그를 업데이트해야합니다.
Kingfisher Phuoc

1
나는 당신의 코드를 보았다. 사실, 당신은 여전히 getActionBar()당신의 MainActivity... 에서 사용 하고 있습니다 . 확인하고 getSupportActionBar.
Kingfisher Phuoc

답변:


151

귀하의 코드는 다음과 com.example.tabwithslidingdrawer.MainActivity.onCreate(MainActivity.java:95)같습니다.

        // enabling action bar app icon and behaving it as toggle button
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

문제는 매우 간단합니다 . Activity새로운 android.support.v7.app.ActionBarActivity. getSupportActionBar()대신에 호출을 사용해야합니다 getActionBar().

코드의 65 행 주위를 살펴보면 이미 수행하고 있음을 알 수 있습니다.

        actionBar = getSupportActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
        // TODO: Remove the redundant calls to getSupportActionBar()
        //       and use variable actionBar instead
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);

그리고 87 번 줄을 아래로 내려 가면 같은 것을 알아 낸 것처럼 보입니다.

        getSupportActionBar().setTitle(
                        Html.fromHtml("<font color=\"black\">" + mTitle + " - "
                                        + menutitles[0] + "</font>"));
        // getActionBar().setTitle(mTitle +menutitles[0]);

어떻게 주석 처리했는지 확인하십시오 getActionBar().


8
참고 : android.support.v7.app.ActionBarActivity을 (를) 위해 더 이상 사용되지 않습니다 android.support.v7.app.AppCompatActivity. 그러나 문제는 동일합니다.
Funktional

1
조각 내부, 여기를
jacktrades

29

누군가 android.app.ActionBarandroid.app.Activity 를 사용하려면 styles.xml 에서 앱 테마를 변경해야 합니다. 예를 들면 다음과 같습니다.

<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">

문제는 AppCompat을 사용할 수 있다는 것입니다. 테마를 입니다.

반면에 android.support.v7.app.ActionBar 를 사용 하고 AppCompatActivity 로 활동을 확장 하려면 AppCompat 테마를 사용 하여이 문제를 방지 해야합니다 . 예를 들면 다음과 같습니다.

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

도움이 되었기를 바랍니다.


이 답변 에서와 같이 AppCompatActivity대신 에서 확장 할 수도 있습니다 . Activity
Keith

물론 @Keith, AppCompat 테마를 사용하려면 AppCompatActivity를 사용해야합니다. 그렇지 않으면 동일한 비 호환성 문제가 발생합니다.
crubio

@crubio 감사합니다!
Kumaresh Babu NS

18

당신이 때 appcompatActivity을 확장 한 후 사용

this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);

당신은 때 액션 바 확장 한 후 사용

this.getActionBar().setDisplayHomeAsUpEnabled(true);

툴바 / 액션 바를 초기화 한 후 oncreate에서이 함수를 호출하는 것을 잊지 마십시오.


12

나는 당신이하고 싶은 것은 getActivity () 캐스트라고 생각합니다. 예를 들면 :

((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);

이것이 새로운 지원 라이브러리로 수행해야하는 작업입니다. AppCompatActivity가 ActionBarActivity를 대체했습니다.


7

여기에서 확인해보세요

입술 >> 값 >> styles.xml

이와 같은 코드가 없는지 확인하십시오.

<item name="windowActionBar">false</item>

그런 코드가 있으면 잠시 비활성화하거나 지울 수 있습니다.


상기시켜 주셔서 감사합니다 !! : DI도에 남아 <item name="windowNoTitle">true</item>있었으므로 제거해야했습니다.
gujci

나를 위해 일한 것은 AndroidManifest.xml의 태그에서 제거 android:theme="@style/AppTheme.NoActionBar"되었습니다.<avticity>
Smaily Carrilho

4

AppCompatActivity를 사용하는 경우

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

전에 getSupportActionBar()

public class PageActivity extends AppCompatActivity {
     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_item);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        this.getSupportActionBar().setDisplayHomeAsUpEnabled(false);

    }
}

2

위로 버튼은 일반적으로 낮은 수준의 활동에 대해 활성화됩니다. 매니페스트에는 MainActivity 만 표시됩니다. 주요 활동에 대해 위로 버튼을 활성화하는 것이 의미가 없다고 생각합니다. 활동을 만든 다음 매니페스트에서 parentActivityName 속성을 추가합니다. 그런 다음 활동의 onCreate 메서드에서 up 버튼을 활성화합니다.
이것은 도움이 될 것입니다.
https://developer.android.com/training/appbar/up-action.html


2

제 경우 styles.xml에는 잘못된 상위 테마 를 설정 했기 때문입니다 . 즉, NoActionBar테마는 물론 getSupportActionbar()null입니다.

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

다른 것으로 변경하여 수정했습니다.

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

2

이 희망을 시도해보십시오, 내 코드는 잘 작동합니다.

Toolbar toolbar = findViewById(R.id.toolbar1);
setSupportActionBar(toolbar);

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setTitle("");

1

활동의이 줄에서 :

super.onCreate(savedInstanceState);
setContentView(R.layout.Activity_Main);

이것을 사용하십시오 :

super.onCreate(savedInstanceState);
setContentView(R.layout.*);

* 당신의 활동입니다


1

제 경우에는 동일한 오류가 있었지만 내 실수는 툴바를 선언하지 않았다는 것입니다.

그래서 getSupportActionBar를 사용하기 전에 툴바를 찾아서 actionBar를 설정해야했습니다.

    appbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(appbar);

    getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_nav_menu);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

1

이 질문이 오래되었다는 것을 알고 있습니다. 그러나 이것은이 문제를 제시하는 많은 사람들에게 도움이 될 수 있습니다.

이 문제를 해결하려면 nullity 지점이 있는지 확인하십시오. 그런 다음 해당 구성을 적용합니다.

if(getSupportActionBar() != null){
 getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 getSupportActionBar().setHomeButtonEnabled(true);
}

1

android.app.ActionBar 및 android.app.Activity를 사용하는 경우 애플리케이션 태그에서 앱 테마를 변경해야합니다.

< application
     android:theme="@android:style/Theme.Holo.Light">

1

이 오류가 발생하면

"java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.appcompat.app.ActionBar.setTitle (java.lang.CharSequence)' on a null object reference. "

그냥 사용

setSupportActionBar (toolbar). 

0

BaseActivity가있는 다른 사람과 그로부터 확장되는 자식의 경우, 작업을 수행하기 전에 super.onCreate ()가 먼저 호출되었는지 확인하십시오. 나중에 super.onCreate ()를 호출하면 이전 활동이 작동합니다.

자녀가 활동을 확장 함-작업을 수행 한 후 super를 호출 할 수 있음

@Override
protected void onCreate(Bundle savedInstanceState)
{
    getActionBar().setDisplayHomeAsUpEnabled(true);
    super.onCreate(savedInstanceState);

자식이 AppCompatActivity를 확장합니다. 먼저 슈퍼에 전화해야합니다.

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState); //do this first
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

0

여전히이 문제가있는 사람들을 위해 AndroidManifest.xml 파일에서 내 문제가 해결되었습니다. 그것이 말하는 경우 <activity android:name=".MainActivity" android:theme="@style/AppTheme.NoActionBar">, 당신은 제거 할 필요가 NoActionBar그것을 만드는, <activity android:name=".MainActivity" android:theme="@style/AppTheme">NoActionBar와 당신이 MainActivity.java의 내부 일을 불러 작업 표시 줄을 원하는 여부를 응용 프로그램 나던 노하우를 설정하기 때문에,


0

한 번 같은 오류가 발생하여 기본 도구 모음 (toolbar.xml)에 대한 템플릿을 만든 다음 다른보기에서 축소 가능한 도구 모음을 만들었습니다.

사용자의 일부 정보 (whatsapp 등)를 표시하는 뷰에 축소 가능한 도구 모음을 추가해야했지만 findViewById 메서드는 축소 가능한 도구 모음 (id 도구 모음)이 아닌 기본 도구 모음 (id 도구 모음)을 참조했습니다. 예, 썼습니다. 두 도구 모음에 동일한 ID가 있으므로 활동에 액세스하려고 할 때 앱이 충돌하여 오류를 표시했습니다.

축소 가능한 도구 모음의 ID를 id : col_toolbar로 변경하여 오류를 수정했는데 오류가 사라지고 내 앱이 완벽하게 작동했습니다.


0

당신은 이것을 시도해야합니다. 나는 그것이 작동 할 것이라고 생각한다.

    Toolbar toolbar = findViewById(R.id.toolbar1);
    setSupportActionBar(toolbar);

    mDrawerLayout = findViewById(R.id.drawer_layout);
    mDrawerLayout = findViewById(R.id.drawer_layout);
    mDrawerLayout.setDrawerShadow(R.drawable.rectagle_with_black_outer,
            GravityCompat.START);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
            toolbar, R.string.navigation_drawer_close,
            R.string.navigation_drawer_close) {
        public void onDrawerClosed(View view) {
            invalidateOptionsMenu();
        }

        public void onDrawerOpened(View drawerView) {
            invalidateOptionsMenu();
        }
    };

0

최상의 솔루션은 Oncreate 메서드에서 수행합니다.

 ActionBar actionBar = getSupportActionBar();

        if(actionBar != null){
            actionBar.setDisplayHomeAsUpEnabled(true);
        }

새로운 수업이 이어집니다.

@Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();

        if(id == android.R.id.home){
            onBackPressed();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

이 코드 스 니펫이 질문에 답할 수 있지만 문제를 해결하는 데 도움이되는 이유와 방법에 대한 설명을 포함하여 답변의 품질과 수명을 향상시킵니다. 좋은 답변을 작성하려면 어떻게해야합니까?를
ammportal

0

뒤에 추가하십시오 Toolbar

Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().hide();

0

저는 Android 앱 개발을 처음 사용합니다. 나는이 오류에 직면했고 그것을 고치려고 거의 5 시간을 소비했다. 마지막으로, 다음이이 문제의 근본 원인이라는 것을 알았으며 앞으로이 문제에 다시 직면하게 될 사람이 있으면이 내용을 읽어주십시오.

비디오 배경이있는 홈 액티비티를 만들려고했는데 부모 테마를 기본 설정에서으로 변경해야 Theme.AppCompat.Light.DarkActionBar했습니다 Theme.AppCompat.Light.NoActionBar. 이것은 홈 활동에서 잘 작동했지만 onclicklistener로 새 버튼을 설정하여 다른 활동으로 이동하여 작업 표시 줄에 사용자 정의 텍스트를 설정하면이 오류가 발생합니다.

그래서 결국 내가 한 것은 두 개의 테마를 만들고 다음과 같이 활동에 할당하는 것이 었습니다.

Theme.AppCompat.Light.DarkActionBar - for Activities with Action Bar (default)
Theme.AppCompat.Light.NoActionBar - for Activities without Action Bar 

오류를 수정하기 위해 다음과 같이 변경했습니다.

  1. styles.xml에서 테마 정의

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
    
    <style name="DefaultTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
  2. 활동을 각각의 주제에 연결 AndroidManifest.xml

    <activity android:name=".Payment"
        android:theme="@style/DefaultTheme"/>
    
    <activity android:name=".WelcomeHome"
        android:theme="@style/AppTheme.NoActionBar">

-1

그러한 오류가 발생할 때마다. 다음 사항을 확인하십시오

  1. 어떤 종류의 Activity가 사용되고 있는지 확인하십시오. 간단한 android.app Activity인지 AppCompatActivity 또는 ActionBarActivity인지 등입니다.

  2. 확장 된 활동 유형이 compat 카테고리에 속하는지 확인하십시오.

예제 android.app 기반 Activity / Fragment는 appCompat 유형이 아닌 반면 android.support.v4.app.Fragment 또는 android.support.v4.app.ActivityCompat는 appCompat 기반입니다.

appCompat에 속하면 getSupportActionBar ()를 사용하고 android.app 유형에는 getActionBar ()를 사용할 수 있습니다.

  1. 매니페스트 파일에서 문제의 활동에 적용된 테마를 확인합니다.

예 : 매니페스트 파일에서 테마가 적용된 경우 android : theme = "@ android : style / Theme.Holo.Dialog"getActionBar ()가 작동합니다.

그러나 매니페스트의 활동에 적용된 테마가 android : theme = "@ style / Theme.AppCompat.Light"와 같으면 getSupportActionBar ()를 사용해야합니다.


-1

새 도구 모음을 만든 경우 setSupportActionBar (); 메서드를 적용했는지 확인하십시오. 그것은 당신을 모욕적으로 도울 것입니다


-3

다음을 시도하십시오.

                getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                getSupportActionBar().setHomeButtonEnabled(true);
                actionBar = getSupportActionBar();
                actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

대신 :

actionBar = getSupportActionBar();
                actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

                getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                getSupportActionBar().setHomeButtonEnabled(true);

getSupportActionBar()이미 actionBar변수에 결과가있는 경우 호출해야하는 이유는 무엇 입니까? 두 변종 모두 나쁘다.
Stan

당신은 getSupportActionBar (); to actionBar = getSupportActionBar (); 그것은 동일합니다!!!! 다리를 흔들다!!!!!
Cabezas

그것은 어떤 차이가되지 않습니다
crubio
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.