0

私のアプリケーションには、ResultListViewActivity と呼ばれる ListView アクティビティがあり、データベースのコンテンツを表示します。リストビューに表示されるコンテンツは、前のアクティビティでクリックされたボタンによって異なります。したがって、ユーザーがメイン アクティビティの「ボタン 1」をクリックすると、特定のコンテンツが ResultListViewActivity に表示されます。

このアクティビティにメニューを追加したいのですが、このメニューの項目も、前にクリックしたボタンに応じて変化するはずです。9ケースあり、ケースごとに個数が異なります。これまでのところ、私はこのコードを持っています:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    Bundle bundle = getIntent().getExtras();
    int filterVariable = bundle.getInt("filterVariable");
    switch (filterVariable) 
    {
    case 1:
        getSupportMenuInflater().inflate(R.menu.filter_fastfood, menu);
        break;

    case 2:
        getSupportMenuInflater().inflate(R.menu.filter_restaurants, menu);
        break;

    case 3: 
        getSupportMenuInflater().inflate(R.menu.filter_coffeeshops, menu);
        break;

    case 4:
        getSupportMenuInflater().inflate(R.menu.filter_bars, menu);
        break;

// [... and so on]
    }
    return super.onCreateOptionsMenu(menu);
}

どの場合でも、実際にメニューにさまざまなアイテムがあります。しかし、デバイスの「メニューボタン」からこれらのアイテムに到達できるようにしたくありません (これは、ユーザーが本能的ではなく、推測するのが難しいためです)。これらの項目は重要なので、代わりにこのメニューを開くボタン (ドロップダウン メニュー/ポップアップ メニュー) を右上隅に配置したいと考えています。

そのようなことができる方法を知っていますか?これはいくつかの Google アプリケーションで見たことがありますが、これを行うために使用するツールを示すチュートリアルが見つかりませんでした。
ありがとう !

ps: アプリケーションで actionbarsherlock を使用しています。

4

1 に答える 1

1

ABS の最新バージョン 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.

これを回避するには、以前のバージョン (バージョン 4.1.0) の ABS をダウンロードする必要があります。ここでリリース履歴に従ってダウンロードのリストを取得できます: http://actionbarsherlock.com/download.html

これは本番アプリからのもので、テスト済みで機能しています。

また、アプリケーションのデフォルト テーマを少し変更する必要があります。例えば:

<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>

プライマリ テーマ@style/Theme.Sherlock.ForceOverflowの属性での使用に注意してください。parentまた<style>、 の名前の追加ではありませんMyTheme.ForceOverflow。上記を実行すると、オーバーフロー メニューが機能します。

また、この属性をメニュー項目に追加する必要があります:

android:showAsAction="ifRoom|withText"

ここで、デバイスに物理的なメニュー キーがあると認識させるには、次のコードを使用します。

注:これはハックであり、明らかに複数のデバイスにアクセスできないため、存在するすべての Android デバイスで動作するかどうかを個人的にテストしたことはありません。自己責任などで使用してください。

try {
    ViewConfiguration config = ViewConfiguration.get(MainPage.this);
    Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
    if (menuKeyField != null) {
        menuKeyField.setAccessible(true);
        menuKeyField.setBoolean(config, false);
    }
} catch (Exception e) {
    e.printStackTrace();
}

ActionBar他のオプションが存在することを示すインジケータを表示しないのに対して、オーバーフロー メニューを強制的に表示することは、個人的な好みです。そのような機能の使用を促進することに対して、技術的に可能な解決策の観点からこれに答えています。UX の観点からそれが望ましいかどうかは別の問題です。

于 2013-03-19T10:25:27.563 に答える