25

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?

antonv
  • 1,227
  • 13
  • 21
Harshal Kalavadiya
  • 2,412
  • 4
  • 38
  • 71
  • Obviously this method is not available in lower version api.That why this happened. so try to increase the version of api. – Sunil Kumar Jul 26 '13 at 05:47
  • I think you should look at ActionBarActivity.onCreatePanelMenu because its something that at least overridden, while onCreateOptionsMenu() is not – antonv Jul 26 '13 at 06:28
  • Have you added an Action View as described in [developers guide](http://developer.android.com/guide/topics/ui/actionbar.html#ActionView)? – antonv Jul 26 '13 at 06:41

1 Answers1

47

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);
}
antonv
  • 1,227
  • 13
  • 21
  • also, Android dev team published a really useful introduction video video about [using ActionBarCompat](http://youtu.be/6TGgYqfJnyc) – antonv Jul 26 '13 at 09:47
  • @Antonio what value do i give for "yourapp"? – Sridhar Sep 16 '13 at 07:41
  • 1
    Doesn't matter much, it can be anything you want that is xml conformable. I.e. name of your app in a single word without dots and other special caracters. The idea is that namespace should be anything but different from default `android` namespace. – antonv Sep 16 '13 at 11:49