こんにちは友人私はv7 AppcompactでActionBarサポートライブラリを実装しました。 ActivityBarActivityでActivityクラスを拡張します。以下は私のメインクラスです
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);
}
}
マニフェストファイルでは、テーマの種類を次のように宣言します
<?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>
以下のようなstyle.xmlで:
<style name="ExampleTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="homeAsUpIndicator">@drawable/new_indicator</item>
<item name="Android:homeAsUpIndicator">@drawable/new_indicator</item>
</style>
上記のコードはAndroidバージョン4.0で正常に機能していますが、2.3デバイスでは機能せず、次のようなエラーが発生します。
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)
だから私はそれをどのように解決できますか?
あなたの問題に対する答えは 公式開発者ガイド にあると思います:
検索ウィジェットを宣言する必要があります
<?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>
アクションビューを構成する必要がある場合(イベントリスナーの追加など)は、onCreateOptionsMenu()コールバック中に行うことができます。静的メソッドMenuItemCompat.getActionView()を呼び出して対応するMenuItemを渡すことにより、アクションビューオブジェクトを取得できます。たとえば、上記のサンプルの検索ウィジェットは次のように取得されます。
@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);
}