NoSuchMethodError error for getActionBar() (API-8)

2019-01-25 04:36发布

问题:

when i run the app it installs but then crashes, ecplise isnt telling there is anything wrong with my code. i think its a problem with my manifest...

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.secondapp"
    android:versionCode="1"
    android:versionName="1.0" >

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

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>                
                <meta-data
                    android:name="android.support.PARENT_ACTIVITY"
                    android:value="com.example.secondapp" />
        </activity>
    </application>

</manifest>

do u guys see any problems?

10-19 10:41:25.589: E/AndroidRuntime(10147): FATAL EXCEPTION: main
10-19 10:41:25.589: E/AndroidRuntime(10147): java.lang.NoSuchMethodError: com.example.secondapp.MainActivity.getActionBar
10-19 10:41:25.589: E/AndroidRuntime(10147):    at com.example.secondapp.MainActivity.onCreate(MainActivity.java:15)
10-19 10:41:25.589: E/AndroidRuntime(10147):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
10-19 10:41:25.589: E/AndroidRuntime(10147):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)
10-19 10:41:25.589: E/AndroidRuntime(10147):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
10-19 10:41:25.589: E/AndroidRuntime(10147):    at android.app.ActivityThread.access$1500(ActivityThread.java:123)
10-19 10:41:25.589: E/AndroidRuntime(10147):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
10-19 10:41:25.589: E/AndroidRuntime(10147):    at android.os.Handler.dispatchMessage(Handler.java:99)
10-19 10:41:25.589: E/AndroidRuntime(10147):    at android.os.Looper.loop(Looper.java:130)
10-19 10:41:25.589: E/AndroidRuntime(10147):    at android.app.ActivityThread.main(ActivityThread.java:3835)
10-19 10:41:25.589: E/AndroidRuntime(10147):    at java.lang.reflect.Method.invokeNative(Native Method)
10-19 10:41:25.589: E/AndroidRuntime(10147):    at java.lang.reflect.Method.invoke(Method.java:507)
10-19 10:41:25.589: E/AndroidRuntime(10147):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
10-19 10:41:25.589: E/AndroidRuntime(10147):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
10-19 10:41:25.589: E/AndroidRuntime(10147):    at dalvik.system.NativeStart.main(Native Method)

this is the logcat, not sure if this will help

回答1:

Use getSupportActionBar available with support library v7 as described here on the 6. Retrieve the Action Bar section

getSupportActionBar documentation



回答2:

java.lang.NoSuchMethodError: com.example.secondapp.MainActivity.getActionBar

On your MainActivity class, you call getActionBar() which is not available to your application.

Your android:minSdkVersion is set to 8 (API-8), which does not provide getActionBar() (only since API-11).

You should use ActionBarSherlock for good backward compatibility, or set android:minSdkVersion but then all devices < API-11 won't be targeted.



回答3:

This is because the getActionBar is a method of api 11, but you can do this:

if (android.os.Build.VERSION.SDK_INT >= 11)
    getActionBar().setDisplayHomeAsUpEnabled(true); //example

and in the activity class add this suppress Lint:

@SuppressLint("NewApi")


回答4:

I faced this same issue before. I just replace

getActionBar()

with

getSupportActionBar()


回答5:

You are probably running on a phone that is lower than API 11, which is when the method getActionBar was introduced. If you need to run on devices lower than API level 11, then you will need to guard against executing those calls that only exist on newer API levels, or else use a compatibility library such as ActionBarSherlock or Action Bar Compatiblity. (See this thread for a discussion of the differences between these two.)

Change the android:minSdkVersion="8" to android:minSdkVersion="11" and all the newer API calls that you are making will light up as errors. This will make it easier to locate those parts of your code that need attention.



回答6:

For api < 11 you have to use:

getSupportActionBar();

Algo make sure you are using appcompat, add this on build.gradle, the 19.+ should be your project target version.

compile 'com.android.support:appcompat-v7:19.+'

Also if you are using invalidateOptionsMenu() for navigation drawer use this instead:

supportInvalidateOptionsMenu();