Android Support Library ActionBar not Working in 2.3 Device

Harshal Kalavadiya picture Harshal Kalavadiya · Jul 26, 2013 · Viewed 14.9k times · Source

Hello friends i implemented ActionBar support Library with v7 Appcompact . I extend my Activity class with ActionBarActivity . Below is my Main Class

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.SearchView;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    MenuItem menuItem=menu.findItem(R.id.menu_settings);
    SearchView mSearchView=(SearchView)menuItem.getActionView();
    return super.onCreateOptionsMenu(menu);
       }

    }

In Manifest File I declare theme type like this

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

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

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

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

in style.xml like below:

<style name="ExampleTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="homeAsUpIndicator">@drawable/new_indicator</item>
    <item name="android:homeAsUpIndicator">@drawable/new_indicator</item>
  </style>

Above Code is Working Fine with Android version 4.0 but in 2.3 device it is not working it gives error like:

java.lang.NoSuchMethodError: android.view.MenuItem.getActionView
    07-26 04:11:40.900: E/AndroidRuntime(412):  at com.example.appcompactdemo.MainActivity.onCreateOptionsMenu(MainActivity.java:24)
07-26 04:11:40.900: E/AndroidRuntime(412):  at android.app.Activity.onCreatePanelMenu(Activity.java:2158)
07-26 04:11:40.900: E/AndroidRuntime(412):  at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:224) 
07-26 04:11:40.900: E/AndroidRuntime(412):  at android.support.v7.app.ActionBarActivity.superOnCreatePanelMenu(ActionBarActivity.java:224)
07-26 04:11:40.900: E/AndroidRuntime(412):  at android.support.v7.app.ActionBarActivityDelegateBase$1.run(ActionBarActivityDelegateBase.java:69)
07-26 04:11:40.900: E/AndroidRuntime(412):  at android.os.Handler.handleCallback(Handler.java:587)
07-26 04:11:40.900: E/AndroidRuntime(412):  at android.os.Handler.dispatchMessage(Handler.java:92)
07-26 04:11:40.900: E/AndroidRuntime(412):  at android.os.Looper.loop(Looper.java:130)
07-26 04:11:40.900: E/AndroidRuntime(412):  at android.app.ActivityThread.main(ActivityThread.java:3683)
07-26 04:11:40.900: E/AndroidRuntime(412):  at java.lang.reflect.Method.invokeNative(Native Method)
07-26 04:11:40.900: E/AndroidRuntime(412):  at java.lang.reflect.Method.invoke(Method.java:507)
07-26 04:11:40.900: E/AndroidRuntime(412):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
07-26 04:11:40.900: E/AndroidRuntime(412):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
07-26 04:11:40.900: E/AndroidRuntime(412):  at dalvik.system.NativeStart.main(Native Method)

So Any idea how can i solve it?

Answer

Antonio picture Antonio · Jul 26, 2013

I think the answer to your problem is in official developers guide:

You should declare search widget

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
    <item android:id="@+id/action_search"
         android:title="@string/action_search"
         android:icon="@drawable/ic_action_search"
         yourapp:showAsAction="ifRoom|collapseActionView"
         yourapp:actionViewClass="android.support.v7.widget.SearchView" />
</menu>

If you need to configure the action view (such as to add event listeners), you can do so during the onCreateOptionsMenu() callback. You can acquire the action view object by calling the static method MenuItemCompat.getActionView() and passing it the corresponding MenuItem. For example, the search widget from the above sample is acquired like this:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_activity_actions, menu);
    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); // <-- change your code to this
    // Configure the search info and add any event listeners
    ...
    return super.onCreateOptionsMenu(menu);
}