web-dev-qa-db-ja.com

メニュー項目はアクションバーに表示されません

アプリでappcompatを使用しています。メニュー項目をアクションバーに表示するか、少なくともオーバーフロー(3ドット)を表示して、スペースがないときに表示するようにします。アクションバーには多くのスペースがありますが、それでも表示されません。メニューフローは、メニューボタンが押されたときにのみ下から上がります。

menu_activity.xml:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto" >

    <item
        Android:id="@+id/menu_lang"
        Android:showAsAction="always"
        Android:title="@string/menu_lang"
        Android:icon="@Android:drawable/ic_input_lang"/>

</menu>

activity:

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

この post は、ハードウェアメニューボタンがある場合は機能しないことを示しています。ただし、他のアプリは同じデバイスでアイテムを表示できます。したがって、その答えは間違っているようです。誰かがこれを手伝ってくれますか?

enter image description here

33
rick

間違ったメニューを使用しているようです。ファイルの名前は「menu_activity.xml」で、Resource-Idでメニューを膨らませます:R.menu.reminder_menu

メニューのリソース名はファイル名と同じである必要があります。つまり、R.menu.manu_activity

これでもう一度試してください-私はこれにも一度遭遇しました、そしてそれは私に夢中になりました...

Update上記の部分が難読化用であることを明確にした後、次のことを確認してください。

  1. ActionBarActivityを拡張します。
  2. アクティビティ(またはアプリ全体)にTheme.AppCompatテーマの1つを使用(または拡張)します
  3. 古いデバイスでは、アクションバーに関連する属性が存在しないため、XML内のこれらすべての属性がカスタム名前空間で使用されていることを確認してください。ここではshowAsAction属性になり、互換性ライブラリがそれらを取得できるようになります。

カスタム名前空間は既に定義されています(メニュータグの「app」)。 Androidガイドに従ってAndroid:showAsActionタグをapp:showAsActionに変更する必要があります。

修正されたmenu_activity.xmlは次のようになります。

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto" >

    <item
        Android:id="@+id/menu_lang"
        app:showAsAction="always"
        Android:title="@string/menu_lang"
        Android:icon="@Android:drawable/ic_input_lang"/>

</menu>

アクションバーの extended Android guide は、これらの新しい厄介なトラップをカバーしています...

70
Patrick

さて、私はあなたのための解決策を見つけたと思います。オーバーフローメニューと呼ばれ、onCreateメソッドで以下のメソッドを呼び出す必要があります。

private void getOverflowMenu() {

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

これを試して、それがあなたのために働くかどうか私に知らせてください。

編集:

私は最終的にあなたの問題を理解したと思います。私はあなたに一つのアイデアを与えることができます。オーバーフローメニューを使用せず、投稿したスクリーンショットに表示されているとおりにメニュー項目を表示する場合は、アクティビティの上にレイアウトを作成できます。

直線的なレイアウトを取り、アクションバーと同じように見える背景を与え、そこに配置したいアイコンを配置し、onClickListenerで機能を与えることができます。これでアイデアが得られることを願っています。これにより、独自のカスタムメニューを作成できます。以下のレイアウトを試して、ic_launcher drawableをメニューアイコンに置き換えてください。次に、それらにonClickListenersを設定し、onClickメソッド内で実行したい機能を実行します。

<RelativeLayout
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:orientation="horizontal"
    Android:background="#66000000" >

    <ImageView
        Android:id="@+id/xMenuBtn1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentLeft="true"
        Android:background="@drawable/ic_launcher" />
     <TextView
        Android:id="@+id/xMenuTxt"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Chats"
        Android:textSize="18sp"
        Android:layout_toRightOf="@+id/xMenuBtn1"
        Android:layout_centerVertical="true" />
    <ImageView
        Android:id="@+id/xMenuBtn2"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_toLeftOf="@+id/xMenuBtn3"
        Android:background="@drawable/ic_launcher" />
    <ImageView
        Android:id="@+id/xMenuBtn3"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentRight="true"
        Android:background="@drawable/ic_launcher" />

</RelativeLayout>
5
user1952459

アクティビティonCreate()で試してください:

ActionBar bar = getSupportActionBar();
bar.setTitle(R.string.app_name);

その後 :

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {    
        menu.clear();
        getSupportMenuInflater().inflate(R.menu.menu_activity, menu);
        return super.onPrepareOptionsMenu(menu);
    }
0
An-droid