web-dev-qa-db-ja.com

Android 2.3デバイスでサポートライブラリActionBarが機能しない

こんにちは友人私は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)

だから私はそれをどのように解決できますか?

25

あなたの問題に対する答えは 公式開発者ガイド にあると思います:

検索ウィジェットを宣言する必要があります

<?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);
}
47
Antonio