52

私は完全に新しいプロジェクトを作りました。menuレイアウト ファイルにアイテムを追加しました。これらのアイテムは、アクション バーの右側には表示されません。メニューを開く 3 つのドットのアイコンが表示されたことを覚えています。

ここに画像の説明を入力

これが私のActivity

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActionBar actionBar = getActionBar();
        actionBar.setBackgroundDrawable(new ColorDrawable(Color.BLUE));     
        actionBar.show();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

そして、これが私のものですmain.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="@string/action_option1"/>
    <item
        android:id="@+id/action_settings34"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="@string/action_option2"/>
    <item
        android:id="@+id/action_settings3"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="@string/action_option3"/>


</menu>
4

12 に答える 12

119

環境

メニュー構成でこのshowAsActionプロパティについて誤解があるようです。多くのスタックオーバーフローの回答で見つけた情報は、常に不完全なようです。そこで、それを変えようという試みです。

スリードット | オーバーフロー | オプションメニュー

アクションバーに 3 つのドットのオーバーフロー メニューを表示するかどうかをコードで制御する方法はありません。

確かにオプションメニューを持たないことで、それを強制的に表示しないようにすることができます。そして、公平を期すために、これをハックすることができます。詳細については、メニューボタンのあるデバイスでオーバーフローメニューを強制的に使用する方法を参照してください

ドットが表示されるかどうかは、テストしているデバイスによって異なります。ユーザーはデバイスのメニュー ボタンを使用できるため、メニュー ボタンのあるデバイスでは、アクションバーに 3 つのドットのアイコンは表示されません。

デバイスのオプション メニュー ボタン

このオプション メニュー ボタンを持たないデバイス (Galaxy 以降の nexus デバイスなど) には、そのオプション メニューをトリガーする代替手段がありません。これらのデバイスで同じアプリを実行すると、アクションバーに 3 つのドット オーバーフロー メニュー オプションが表示されます。

オプションメニューを表示するアクションバー

コントロールできること

showAsActionメニュー xml ファイルには、単一のメニュー オプションがアクションバーにどのように表示されるかを制御するために使用できるオプションがあります。

公式メニュー リソース docによると、オプションは次のとおりです。

android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]

フラグは、ifRoom十分なスペースがある場合にのみオプションを表示します。ほとんどの場合、これを最初に選択する必要があります。ただし、これにより、アクションバーのタイトルが圧縮されます (垂直方向のスクリーンショットを参照)。

フラグには、このneverオプションが常にオーバーフロー メニューにあり、アクションバーに直接表示されることはありません。

フラグを使用するとalways、オプションが acitonbar に常に表示されるようになるため、このフラグの使用は推奨されません。非常に小さな画面サイズで実行している場合でも。これにより、タイトルが完全に見えなくなる可能性があります。

android:titleオプション メニューにはと プロパティの両方を含めることができandroid:iconます。フラグをorwithTextと一緒に使用して (間にパイプを使用)、アイテムのテキストをアクションバーでレンダリングするときにアイコンの横に強制的に表示することができます。alwaysifRoom|

collapseActionViewからのみサポートされAPI level 14ているため、無視させてください。

デバイスが縦向きモードで保持されている場合の動作中の以下のコード スニペットを示すスクリーンショット:

折りたたまれたタイトルと、ほとんどが垂直方向のアイコン

そして、横向きモードのおかげでアクションバーにより多くのスペースがある別のスクリーンショット:

ランドスケープ モードのアクションバーがレンダリングされました

Android ドキュメント

このアクションバーに関する最適な開発ドキュメントは、アクションバー ガイドです。デザイン ガイドラインをさらに探している場合は、このリンクをたどってくださいメニュー リソースのリンクは以前に記載されていました。一般的なメニューについては、これを確認してください。

コードスニペット

その部分はほとんどの回答で正しいと思われるため、参照用のコードです。より完全な例は、https://github.com/AndroidExamples/fragment-navigationにあります。

/res/menu/main.xmlファイルの内容:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="be.hcpl.android.example.MainActivity" >

<!-- an option that never appears as a fixed text/icon in the actionbar -->
<item android:id="@+id/action_one"
    android:title="@string/action_one"
    android:orderInCategory="100"
    app:showAsAction="never" />

<!-- another option that only appears if there is enough room -->
<item android:id="@+id/action_two"
    android:title="@string/action_two"
    android:orderInCategory="200"
    app:showAsAction="ifRoom" />

<!-- a last option that always appears -->
<item android:id="@+id/action_three"
    android:title="@string/action_three"
    android:orderInCategory="300"
    app:showAsAction="always" />

<!-- an option to show with both icon and text -->
<item android:id="@+id/action_four"
    android:icon="@android:drawable/ic_menu_directions"
    android:title="@string/action_four"
    android:orderInCategory="400"
    app:showAsAction="withText|always" />

<!-- an option to always show as an icon only -->
<item android:id="@+id/action_five"
    android:icon="@android:drawable/ic_menu_info_details"
    android:title="@string/action_five"
    android:orderInCategory="500"
    app:showAsAction="always" />

</menu>

いくつかのリンクされた回答

于 2014-04-15T09:47:49.927 に答える
9

常に右上にオーバーフロー メニュー アイコンを表示し、そこからメニューを開きたいと思います。そこに強制するには、次のようなことを試してください。

あなたの中onCreate()で:

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

アプリにオーバーフロー メニューを強制的に表示させます。メニュー ボタンは引き続き機能しますが、右上隅のメニューが開きます。How to force use of overflow menu on devices with menu button のこの回答から取得しました。これは一種の「ハック」かもしれませんが、機能します。

編集:

@gunar からの有用なコメントに基づいて、このメソッドを使用しないように要求します。理由は次のとおりです。

  • private フィールドsHasPermanentMenuKeyは、将来のリリースでリファクタリングされる可能性があります。その場合、アプリは機能しなくなります。

  • また、アクション アイテムに慣れているという理由で強制的にアクション アイテムをアクション バーに移動すると、デバイスでのアプリの実行方法に慣れているユーザーを混乱させることになります。ハードウェアキー付きのものmenuは、メニューのハードウェアキーからオプションを表示するために使用されます。オーバーフロー メニューの 3 つのドットを意図的に表示すると、混乱する可能性があります。

その意味で、すべてのアプリを統一しましょう。アイテムのハードウェア キーを持たないデバイスでは、menuそれらが自動的に表示されます。

于 2013-08-02T06:32:18.087 に答える
7

または、次のような構造を作成できます。

<?xml version="1.0" encoding="utf-8"?>
<menu >
<item
    android:id="@+id/menu_main"
    android:icon="@drawable/icon_menu"
    android:showAsAction="always"
    android:title="@string/menu_A"
    android:visible="true">
    <menu>
        <item
            android:id="@+id/menu_settings1"
            android:showAsAction="never"
            android:title="@string/menu_A1"/>
        <item
            android:id="@+id/menu_settings2"
            android:showAsAction="never"
            android:title="@string/menu_A2"/>
        <item
            android:id="@+id/menu_settings3"
            android:showAsAction="never"
            android:title="@string/menu_A3"/>
    </menu>
</item>
</menu>

icon_menu では、3 点のアイコン クリップアートを使用して新しいアイコン セットを作成できます。

于 2014-08-21T19:29:13.917 に答える
2

たくさんの回答を検索して読んだ後、注意を払うべき小さなことがもう 1 つあります。

少なくともそれは私の問題であり、上記の答えは見つかりませんでした。あなたの.XMLファイルに。以下の例のように、android:showAsAction=フォームandroidパッケージではなく、パッケージから取得する必要があります。app

app:showAsAction=

appパッケージをインポートすることを忘れないでください。

于 2016-07-26T14:15:35.617 に答える
1

私はセットsetHasOptionsMenu(true)するonViewCreated必要がありましたonCreate

于 2020-06-16T20:08:46.760 に答える
0

アクティビティの onCreate 関数でこの関数を呼び出す必要があります。

RequestWindowFeature (Window.FEATURE_ACTION_BAR);
于 2015-11-15T18:38:35.057 に答える