26

4.0以降のオーバーフローメニューをICS以前のデバイス(2.3〜2.1)で使用したい。ActionBarSherlockでHoloEverywhereを使用しています。

私は次の解決策を試しました:

ActionBarSherlock&HoloEverywhere-強制オーバーフロー?

しかし、存在しないためabsForceOverflow機能しません。最新バージョンか何かで削除されましたか?ABSとHEの両方のライブラリプロジェクトのファイルを確認しましたがR、フィールドがありません。

私のアプリのテーマはに設定されて@style/Holo.Theme.Sherlock.Lightおり、それは私が継承しようとしていたテーマであり、absForceOverflowパラメーターセットをに追加しますtrue

4

4 に答える 4

36

ActionbarSherlock 4.2 から、オーバーフロー メニューの表示を管理する機能が失われました。それを機能させるには、2 つのアプローチを組み合わせる必要があります。

  1. Android 3.x (ハニカム) 以降のメニューの表示を強制するには、このハックを使用し、Android バージョンのチェックを追加する必要があります。

    public static final int DEVICE_VERSION   = Build.VERSION.SDK_INT;
    public static final int DEVICE_HONEYCOMB = Build.VERSION_CODES.HONEYCOMB;
    if (DEVICE_VERSION >= DEVICE_HONEYCOMB)
        // Code from answer above
    
  2. プレハニカム デバイスのメニューを開く:

    • 開くActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuPresenter.java、メソッドに移動reserveOverflow
    • オリジナルを次のものに置き換えます。

      public static boolean reserveOverflow(Context context) { true を返します。}

    これにより、強制的にメニューが表示されます...

    • しかし、メニューボタンをクリックするとメニューポップアップが表示されません。これを実現するには、アクティビティクラスでこれをオーバーライドする必要があります。

      @Override
      public boolean onKeyUp(int keyCode, KeyEvent event) {
          if (DEVICE_VERSION < DEVICE_HONEYCOMB) {
              if (event.getAction() == KeyEvent.ACTION_UP &&
                  keyCode == KeyEvent.KEYCODE_MENU) {
                  openOptionsMenu();
                  return true;
              }
          }
          return super.onKeyUp(keyCode, event);
      }
      

このアクションの後、すべての Android バージョンでオーバーフロー アクション バー メニューが完全に機能するはずです。

于 2012-11-26T15:33:53.453 に答える
27

Siddharth Lele が指摘したように、実際のアクション バーと同じように動作するために、最後の ABS バージョンでは削除されました。したがって、一見すると、このメニューの表示をあきらめるのが最善の選択肢です。

ただし、一部のデバイスでは画面に表示され、他のデバイスでは表示されないオーバーフロー メニューは、Android の Action Bar の大きな設計上の欠陥です。理由は次のとおりです。

ハードウェア メニュー キーを備えたデバイスでは、メニューはアクション バーに表示されません。最近のデバイスでは、HW ボタンの数を最小限に減らす傾向があります。これは、よりユーザーフレンドリーであると考えられているためです (また、iPhone にはボタンしかないため、このデザインをコピーしています)。他のメーカーにはメニューボタンが含まれていますが、それを押さない限り隠されています(はい、ライトが必要なくなったときに点灯します.

この意味をよりよく理解するために、例を見てみましょう: ユーザーAはメニュー キーのあるデバイスを持っています。彼はお気に入りのメール クライアントを使用しています。メール アカウントを設定するためのオプションは、通常のオプション (ヘルプ、概要など) とともに、オーバーフロー メニューに配置されます。彼は 2 つ目のアカウントを追加したいと考えていますが、このメニューにアクセスする方法がわかりません。彼が何をすべきかを理解するのに役立つ情報が画面にありません。そこでユーザーは、このメール クライアントも使用しているA友人に尋ねます。BユーザーBは最新の Nexus N+1 Google フォンを使用しており、デバイスに HW メニュー キーがないため、アクション バーにオーバーフロー アイコンが表示されます。彼はA、このメニューを開いて 2 つ目のアカウントを追加する方法を示しています。ユーザーA同じバージョンのアプリを使用しているため、完全に混乱しています。欲求不満でA、問題は彼の携帯電話が古すぎることだと思うかもしれません。Bも同様に混乱しています。

この時点で、あなたは両方Aを考えているかもしれませんがB、スマートフォンの使い方がわからない愚か者です。しかし、デスクトップ アプリとは異なり、大多数のスマートフォン ユーザーは自分のデバイスについて基本的なことしか知りません。彼らの以前の電話は、単純なファームウェアを備えたキーパッド デバイスであった可能性があります。電池が切れて交換を求めて店に行ったが、在庫がなかった。彼らはインターネットで注文することもできましたが、新しい電話を購入するよりも高価でした. タッチスクリーン対応の電話が販売されたのは、それが今日の電話のあり方だからです。今、彼らは本格的な OS を搭載した小さなコンピューターに直面しなければなりません。さらに悪いことに、電話には「クイック スタート ガイド」しか付属しておらず、完全なマニュアルを入手するには、インターネットから PDF をダウンロードする必要があります。何だと思う?彼らはしません。

モバイル アプリを開発している場合は、ユーザーがコンピューター、OS、または同様のアプリについて何も知らない可能性があると想定する必要があります。人々が GUI の使い方を学び、覚えられるように、GUI はどのデバイスでも同じように見えるようにする必要があります。アクション バーの設計者を責めないでください。ユーザーがオプション メニューに移動する方法を気に入っAたり、知らない場合は、そもそもあなたの責任です。そのため、オプション画面を常に表示する手段を含める必要がありました。B

戻るキーでも同様のことが起こります。一部のデバイスには HW バック キーがある場合がありますが、新しいデバイスには通常ありません。しかし、アプリに戻ることができるときはいつでも、アクション バーにその矢印のようなボタンが表示されていますよね? はい、1 つのボタンが「ナビゲーション ツリー」に戻り、もう 1 つのボタンが「時間をさかのぼる」ことは知っていますが、これは別の設計上の欠陥でもあります。画面にこのボタンがあり、HW ボタンも使用できますが、これはオプションです。オーバーフロー メニューでも同じことを行う必要がありました。

したがって、(私のように) これが重要なボタンだと思う場合は、あきらめないでください。通常のメイン オプション メニューを提供し、関連するサブメニューを追加します。それをアクション ボタンにして、説明的なアイコン、または「MENU」のようなテキストの説明を割り当てます。次のいずれかのドローアブルを使用して、オーバーフロー メニュー アイコンを模倣することもできます。

    // For ActionBarSherlock
    abs__ic_menu_moreoverflow_normal_holo_dark.png
    abs__ic_menu_moreoverflow_normal_holo_light.png

    // For ActionBar
    ic_menu_moreoverflow_normal_holo_light.png
    ic_menu_moreoverflow_normal_holo_dark.png

さらに、画像をコピーしてプロジェクトの res フォルダーに貼り付けます。ABS の将来のリリースまたは ActionBar の次の実装にそれらが含まれるかどうかはわかりません。

于 2012-11-12T09:49:04.800 に答える
19

バージョン 4.2.0 を使用している場合、.ForceOverflowテーマは実際には削除されています。

出典: バージョン 4.2.0 変更ログ

変更ログの抜粋:

Add SearchView widget for standard search interaction (API 8+ only)
Fix: ShareActionProvider in the split action bar no longer fills the entire screen.
Fix: ShareActionProvider now does file I/O on a background thread.
Fix: Automatically correct ColorDrawable not respecting bounds when used as a stacked background.
Fix: Ensure fragments collection is present before dispatching events.
Fix: XML-defined onClick searches the correct context for the declared method.
Fix: Ensure action mode start/finish callbacks are invoked on the activity for the native action bar.
Fix: Allow tab callbacks to have a fragment transaction instance for any FragmentActivity.
Fix: Ensure CollapsibleActionView callbacks are dispatched in both native and compatbility action bars.
Fix: Remove .ForceOverflow themes. These never should have been included.

絶対にオーバーフローを強制する必要がある場合は、以前のバージョンの ABS をダウンロードする必要があります。ここでリリース履歴に従ってダウンロードのリストを取得できます: http://actionbarsherlock.com/download.html

現在、アプリに補助的な変更を加えたくないので、個人的にはまだ ABS バージョン 4.1.0 を使用しています。私もこれを私の中で使用していますtheme.xml

<style name="MyTheme" parent="@style/Theme.Sherlock.ForceOverflow">
    <item name="android:windowBackground">@color/background</item>
    <item name="actionBarStyle">@style/Widget.Styled.ActionBar</item>
    <item name="android:actionBarStyle">@style/Widget.Styled.ActionBar</item>
</style>

<style name="MyTheme.ForceOverflow">
    <item name="absForceOverflow">true</item>
</style>

の にテーマを適用する際Activitymanifest.xml、これを属性として使用します。"@style/Theme.SociallyYOU"

繰り返しますが、オーバーフローを絶対に強制する必要がある場合は、 https ://stackoverflow.com/a/12872537/450534 の別の質問で CommonsWare の考えを読むこともできます。

注:そうは言っても、トレードオフがそれほど重要でない場合は、常に最新バージョンを使用することをお勧めします。オーバーフロー メニューを強制する方法を投稿することで、古いバージョンを使用することを示唆しているわけでも、推奨しているわけでもありません。単に可能性を知らせているだけです。

于 2012-11-01T15:28:29.927 に答える