Lỗi Android [Cố gắng gọi phương thức ảo 'void android.app.ActionBar' trên tham chiếu đối tượng rỗng]


97

Tôi có một mô-đun mã triển khai viewpager với ngăn điều hướng, tuy nhiên, khi tôi chạy mã, tôi gặp lỗi sau

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)

chỉ vào dòng này

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

toàn bộ mã http://pastebin.com/u1K72fr7

Tệp kê khai của tôi

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

================================================== ================ CHỈNH SỬA / CẬP NHẬT:

Tôi học được gì từ điều này

Bất cứ khi nào một lỗi như vậy xảy ra

1. Kiểm tra xem loại Hoạt động nào đang được sử dụng, đó là Hoạt động android.app đơn giản hay AppCompatActivity hay ActionBarActivity, v.v.

2. Kiểm tra xem loại hoạt động được mở rộng của bạn có thuộc danh mục compat không

ví dụ: Activity / Fragment dựa trên android.app không phải là loại appCompat, trong khi android.support.v4.app.Fragment hoặc android.support.v4.app.ActivityCompat dựa trên appCompat

nếu nó thuộc appCompat, chúng ta sử dụng getSupportActionBar (). Còn đối với các loại android.app, chúng ta có thể sử dụng getActionBar ()

3. Kiểm tra chủ đề được áp dụng cho hoạt động được đề cập trong tệp kê khai

ví dụ: Trong tệp kê khai nếu chủ đề được áp dụng là android: theme = "@ android: style / Theme.Holo.Dialog" getActionBar () sẽ hoạt động

nhưng nếu chủ đề được áp dụng cho hoạt động trong tệp kê khai như sau android: theme = "@ style / Theme.AppCompat.Light" thì bạn phải sử dụng getSupportActionBar ()


3
di bạn thử getSupportActionbar()?
bói cá Phước

tôi đang sử dụng getSupportActionbar đã có trong mã của tôi
ViVekH

Bạn đã sử dụng chủ đề App compat? Bạn nên đăng Bản kê khai cùng với bản khai báo hoạt động của mình tại đây để được trợ giúp thêm.
Bói cá Phước

bạn nên xem lại mã của mình. Tôi có thể nhận được supportActionBar(không phải null) với chủ đề của bạn. Bạn đã thay thế tất cả getActionBarbằng getSupportActionBar? Còn 1 điều nữa, bạn nên cập nhật nhật ký lỗi mới của mình.
bói cá Phước

1
Tôi đã xem mã của bạn. Trên thực tế, bạn vẫn sử dụng getActionBar()trong MainActivity... Hãy kiểm tra nó và thay đổi thành getSupportActionBar.
bói cá Phước

Câu trả lời:


151

Mã của bạn đang chạy 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);

Vấn đề là khá đơn giản - của bạn Activitylà kế thừa từ cái mới android.support.v7.app.ActionBarActivity. Bạn nên sử dụng một cuộc gọi đến getSupportActionBar()thay vì getActionBar().

Nếu bạn nhìn phía trên xung quanh dòng 65 của mã của mình, bạn sẽ thấy rằng bạn đang làm điều đó:

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

Và sau đó hạ xuống xung quanh dòng 87, có vẻ như bạn đã tìm ra giống nhau:

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

Chú ý cách bạn bình luận getActionBar().


8
Chỉ cần lưu ý: android.support.v7.app.ActionBarActivityđã không còn được ủng hộ android.support.v7.app.AppCompatActivity. Nhưng vấn đề là như nhau.
Funktional

1
Bên trong một mảnh, xem đây
jacktrades

29

Nếu ai đó muốn sử dụng android.app.ActionBarandroid.app.Activity, bạn nên thay đổi chủ đề ứng dụng trong styles.xml , ví dụ:

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

Vấn đề là bạn có thể đang sử dụng một chủ đề AppCompat .

Mặt khác, nếu bạn muốn sử dụng android.support.v7.app.ActionBar và bạn mở rộng hoạt động của mình với AppCompatActivity thì bạn phải sử dụng chủ đề AppCompat để tránh vấn đề này, ví dụ:

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

Hi vọng điêu nay co ich.


Bạn cũng có thể mở rộng từ AppCompatActivitythay vì Activity, như trong câu trả lời này .
Keith

Chắc chắn rồi @Keith, nếu bạn muốn sử dụng một chủ đề AppCompat, bạn phải sử dụng một AppCompatActivity, nếu không bạn sẽ gặp phải vấn đề không tương thích tương tự.
crubio

@crubio Cảm ơn!
Kumaresh Babu NS

18

khi bạn mở rộng appcompatActivity thì hãy sử dụng

this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);

và khi bạn mở rộng ActionBar thì hãy sử dụng

this.getActionBar().setDisplayHomeAsUpEnabled(true);

đừng quên gọi hàm này trong oncreate sau khi khởi tạo thanh công cụ / thanh hành động


12

Tôi nghĩ những gì bạn muốn làm là truyền getActivity (). Ví dụ:

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

Đây là những gì bạn cần làm với các thư viện hỗ trợ mới. AppCompatActivity đã thay thế ActionBarActivity.


7

Hãy thử kiểm tra tại đây

res >> giá trị >> styles.xml

đảm bảo rằng không có mã nào như thế này

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

nếu có mã như vậy, bạn có thể vô hiệu hóa một lúc hoặc xóa nó


Cảm ơn bạn đã nhắc nhở!! : DI cũng được để lại <item name="windowNoTitle">true</item>, mà phải được loại bỏ.
gujci

Đối với tôi, những gì hiệu quả đã được xóa android:theme="@style/AppTheme.NoActionBar"khỏi <avticity>thẻ trên AndroidManifest.xml
Smaily Carrilho

4

Khi sử dụng AppCompatActivity phải gọi

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

Trước 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

Nút Lên thường được kích hoạt cho các Hoạt động cấp thấp. Trong tệp kê khai của bạn, tôi chỉ thấy MainActivity. Tôi không nghĩ việc kích hoạt nút lên cho hoạt động chính là hợp lý. Tạo một hoạt động, sau đó trong tệp kê khai thêm thuộc tính parentActivityName. Sau đó, kích hoạt nút lên trên phương thức onCreate của hoạt động.
Điều này sẽ giúp ích.
https://developer.android.com/training/appbar/up-action.html


2

Trong trường hợp của tôi là do styles.xmlđặt sai chủ đề mẹ, tức là NoActionBarchủ đề tất nhiên getSupportActionbar()là null:

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

Đã thay đổi nó thành một cái gì đó khác đã sửa nó:

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

2

Hãy thử điều này hy vọng nó sẽ hoạt động, mã của tôi hoạt động tốt

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

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

1

trong dòng này trong hoạt động của bạn:

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

dùng cái này:

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

* là hoạt động của bạn


1

Trong trường hợp của tôi, tôi cũng gặp lỗi tương tự nhưng lỗi của tôi là tôi đã không khai báo Thanh công cụ của mình.

Vì vậy, trước khi sử dụng getSupportActionBar, tôi phải tìm thanh công cụ của mình và đặt actionBar

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

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

1

Tôi biết rằng câu hỏi này là một cái gì đó cũ. Nhưng điều này có thể giúp nhiều người trình bày vấn đề này.

Để giải quyết vấn đề này, hãy kiểm tra xem có điểm nào không. Sau đó áp dụng cấu hình tương ứng:

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

1

Nếu bạn đang sử dụng android.app.ActionBar và android.app.Activity, bạn nên thay đổi chủ đề ứng dụng trong thẻ ứng dụng:

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

0

Đối với bất kỳ ai khác có BaseActivity và con mở rộng từ nó, hãy đảm bảo rằng super.onCreate () được gọi đầu tiên trước khi bạn làm bất cứ điều gì. Activity cũ sẽ hoạt động nếu sau đó bạn gọi super.onCreate ().

Hoạt động mở rộng trẻ em - có thể gọi là siêu sau khi bạn làm xong việc

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

Child mở rộng AppCompatActivity - bạn phải gọi siêu đầu tiên

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

0

Đối với những người vẫn gặp sự cố này, sự cố của tôi đã được giải quyết trong tệp AndroidManifest.xml. Khi nó nói <activity android:name=".MainActivity" android:theme="@style/AppTheme.NoActionBar">, bạn cần phải xóa NoActionBar, làm cho nó <activity android:name=".MainActivity" android:theme="@style/AppTheme">, bởi vì với thiết lập NoActionBar, ứng dụng không biết liệu nó có muốn một thanh tác vụ hay không khi bạn gọi một thanh bên trong MainActivity.java


0

Tôi đã gặp lỗi tương tự một lần, tôi đã tạo mẫu cho thanh công cụ mặc định (toolbar.xml) và sau đó trong một chế độ xem khác, tôi đã tạo một thanh công cụ có thể thu gọn.

Tôi đã yêu cầu thêm thanh công cụ có thể thu gọn vào dạng xem hiển thị một số thông tin của người dùng (như whatsapp), nhưng phương thức findViewById đang tham chiếu đến thanh công cụ mặc định (thanh công cụ id), không phải thanh công cụ có thể thu gọn (thanh công cụ id) vâng, tôi đã viết cùng một id cho cả hai thanh công cụ, vì vậy khi tôi cố gắng truy cập hoạt động, ứng dụng đã bị lỗi hiển thị cho tôi lỗi.

Tôi đã sửa lỗi bằng cách thay đổi id của thanh công cụ có thể thu gọn thành id: col_toolbar và lỗi đã biến mất và ứng dụng của tôi hoạt động hoàn hảo


0

Bạn nên thử cái này. Tôi nghĩ rằng nó sẽ hoạt động.

    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

Giải pháp tốt nhất làm điều này trong phương pháp Oncreate của bạn

 ActionBar actionBar = getSupportActionBar();

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

tiếp theo là một lớp học mới

@Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();

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

        return super.onOptionsItemSelected(item);
    }

Mặc dù đoạn mã này có thể trả lời câu hỏi, bao gồm giải thích tại sao và cách nó giúp giải quyết vấn đề, cải thiện chất lượng và tuổi thọ của câu trả lời của bạn. Xem Làm thế nào để tôi viết một câu trả lời tốt?
ammportal

0

Vui lòng thêm sau Toolbar

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

0

Tôi là người mới phát triển ứng dụng Android. Tôi đã đối mặt với lỗi này và dành gần 5 giờ để cố gắng sửa chữa nó. Cuối cùng, tôi đã phát hiện ra nguyên nhân gốc rễ của vấn đề này và nếu có ai gặp lại vấn đề này trong tương lai, vui lòng đọc bài viết này.

Tôi đã cố gắng để tạo ra một chủ Activitiy với một nền Video, mà tôi đã phải thay đổi chủ đề cha mẹ từ các thiết lập mặc định của Theme.AppCompat.Light.DarkActionBarđểTheme.AppCompat.Light.NoActionBar . Điều này hoạt động tốt cho Hoạt động trên trang chủ, nhưng khi tôi đặt một nút mới với công cụ kích hoạt onclicklistener để điều hướng đến một Hoạt động khác, nơi tôi đã đặt văn bản tùy chỉnh cho Thanh tác vụ, lỗi này sẽ xuất hiện.

Vì vậy, những gì tôi đã làm là tạo ra hai chủ đề và gán chúng cho các hoạt động như sau.

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

Tôi đã thực hiện các thay đổi sau đây để sửa lỗi.

  1. Xác định các chủ đề trong 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. Liên kết các Hoạt động với Chủ đề tương ứng của chúng trong AndroidManifest.xml

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

0

Nếu bạn gặp lỗi này

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

Chỉ dùng

setSupportActionBar (toolbar). 

-1

Bất cứ khi nào lỗi như vậy xảy ra. Hãy thử kiểm tra những điều sau đây

  1. Kiểm tra xem loại Hoạt động nào đang được sử dụng, đó là Hoạt động android.app đơn giản hay AppCompatActivity hoặc ActionBarActivity, v.v.

  2. Kiểm tra xem loại hoạt động được mở rộng của bạn có thuộc danh mục tổng hợp hay không

ví dụ: Activity / Fragment dựa trên android.app không phải là loại appCompat, trong khi android.support.v4.app.Fragment hoặc android.support.v4.app.ActivityCompat dựa trên appCompat

nếu nó thuộc appCompat, chúng ta sử dụng getSupportActionBar (). Còn đối với các loại android.app, chúng ta có thể sử dụng getActionBar ()

  1. Kiểm tra chủ đề được áp dụng cho hoạt động được đề cập trong tệp kê khai

ví dụ: Trong tệp kê khai nếu chủ đề được áp dụng là android: theme = "@ android: style / Theme.Holo.Dialog" getActionBar () sẽ hoạt động

nhưng nếu chủ đề được áp dụng cho hoạt động trong tệp kê khai như sau android: theme = "@ style / Theme.AppCompat.Light" thì bạn phải sử dụng getSupportActionBar ()


-1

nếu bạn đã tạo một thanh công cụ mới thì hãy áp dụng, hãy kiểm tra xem bạn đã áp dụng phương thức setSupportActionBar (); nó sẽ giúp bạn


-3

Hãy thử làm điều này:

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

Thay vì điều này:

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

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

Tại sao phải gọi getSupportActionBar()nếu bạn đã có kết quả của nó trong actionBarbiến? Cả hai biến thể đều xấu.
Stan

Bạn thay đổi getSupportActionBar (); thành actionBar = getSupportActionBar (); Nó giống nhau!!!! Rung chân !!!!!
Cabezas

Nó không thực hiện bất kỳ sự khác biệt
crubio
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.