2012年1月4日水曜日

ActionBarCompat

GALAXY NEXUS が発売されてAndroid 4.0(ICS)端末が市場に出てきました。
Honeycombで搭載されたActionBarがいい具合にスマホ化されていてカックイイです(*゚∀゚)

Android SDKのサンプルに、ActionBarCompat という、バージョン差を吸収してActionBarを表示する(Honeycombより前のAndroidではActionBarモドキを表示する)アプリがあったので、Toroくんのブログを参考に拙作 あとでよむ twiccaプラグイン に組み込んでみました(Ver.1.2)。

ところが直後から「IS01で起動できなくなった」「SH-10B(LYNX)で動かない」というコメントが…orz
おかしいな、エミュレータで Android 1.6 でも動くことを確認したのに。。
実機を借りて確認したら AbstractMethodError で落ちてました。ぐぬぬ…


12-22 19:07:00.906: E/AndroidRuntime(11445): Uncaught handler: thread main exiting due to uncaught exception
12-22 19:07:00.906: E/AndroidRuntime(11445): java.lang.AbstractMethodError: abstract method not implemented
12-22 19:07:00.906: E/AndroidRuntime(11445): at com.example.android.actionbarcompat.SimpleMenuItem.setShortcutLabel(SimpleMenuItem.java)
12-22 19:07:00.906: E/AndroidRuntime(11445): at android.view.MenuInflater$MenuState.setItem(MenuInflater.java:301)
12-22 19:07:00.906: E/AndroidRuntime(11445): at android.view.MenuInflater$MenuState.addItem(MenuInflater.java:320)
12-22 19:07:00.906: E/AndroidRuntime(11445): at android.view.MenuInflater.parseMenu(MenuInflater.java:154)
12-22 19:07:00.906: E/AndroidRuntime(11445): at android.view.MenuInflater.inflate(MenuInflater.java:80)
12-22 19:07:00.906: E/AndroidRuntime(11445): at com.example.android.actionbarcompat.ActionBarHelperBase$WrappedMenuInflater.inflate(ActionBarHelperBase.java:244)
12-22 19:07:00.906: E/AndroidRuntime(11445): at jp.coffee_club.atode.ListActivity.onCreateOptionsMenu(ListActivity.java:218)
12-22 19:07:00.906: E/AndroidRuntime(11445): at android.app.Activity.onCreatePanelMenu(Activity.java:2060)
12-22 19:07:00.906: E/AndroidRuntime(11445): at com.example.android.actionbarcompat.ActionBarHelperBase.onPostCreate(ActionBarHelperBase.java:72)
12-22 19:07:00.906: E/AndroidRuntime(11445): at com.example.android.actionbarcompat.ActionBarActivity.onPostCreate(ActionBarActivity.java:60)
12-22 19:07:00.906: E/AndroidRuntime(11445): at android.app.Instrumentation.callActivityOnPostCreate(Instrumentation.java:1188)
12-22 19:07:00.906: E/AndroidRuntime(11445): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2572)
12-22 19:07:00.906: E/AndroidRuntime(11445): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2606)
12-22 19:07:00.906: E/AndroidRuntime(11445): at android.app.ActivityThread.access$2200(ActivityThread.java:134)
12-22 19:07:00.906: E/AndroidRuntime(11445): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1940)
12-22 19:07:00.906: E/AndroidRuntime(11445): at android.os.Handler.dispatchMessage(Handler.java:99)
12-22 19:07:00.906: E/AndroidRuntime(11445): at android.os.Looper.loop(Looper.java:123)
12-22 19:07:00.906: E/AndroidRuntime(11445): at android.app.ActivityThread.main(ActivityThread.java:4403)
12-22 19:07:00.906: E/AndroidRuntime(11445): at java.lang.reflect.Method.invokeNative(Native Method)
12-22 19:07:00.906: E/AndroidRuntime(11445): at java.lang.reflect.Method.invoke(Method.java:521)
12-22 19:07:00.906: E/AndroidRuntime(11445): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799)
12-22 19:07:00.906: E/AndroidRuntime(11445): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
12-22 19:07:00.906: E/AndroidRuntime(11445): at dalvik.system.NativeStart.main(Native Method)

MenuInflaterのインナークラスMenuStateのsetItem()メソッドはMenuItemのメソッドを連結して呼び出しているので、おそらくここでメーカーカスタマイズしたMenuItemの追加メソッド setShortcutLabel() を呼び出しているのでしょう。
SimpleMenuItemにも setShortcutLabel() を実装すればよさそう(*゚∀゚)

というわけで src/com/example/android/actionbarcompat/SimpleMenuItem.java に
    // IS01/LYNX対策
    public MenuItem setShortcutLabel(CharSequence label) {
        return this;
    }
というメソッドを追加して対策完了ですん(ω)

p.s.同じトコロでハマってる人がいました(^^ゞ → こちら

0 件のコメント:

コメントを投稿