web-dev-qa-db-ja.com

AppCompatActivityでアイコンとテキストを含むメニュー項目を表示する方法

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=".MainActivity">
    <item
        Android:id="@+id/action_create_alarm"
        Android:icon="@drawable/ic_action_accept"
        Android:orderInCategory="100"
        Android:title="@string/menu_create_alarm"
        app:showAsAction="ifRoom|withText" />
</menu>

または

<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=".MainActivity">
    <item
        Android:id="@+id/action_create_alarm"
        Android:icon="@drawable/ic_action_accept"
        Android:orderInCategory="100"
        Android:title="@string/menu_create_alarm"
        app:showAsAction="always|withText" />
</menu>

または

<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=".MainActivity">
    <item
        Android:id="@+id/action_create_alarm"
        Android:icon="@drawable/ic_action_accept"
        Android:orderInCategory="100"
        Android:title="@string/menu_create_alarm"
        app:showAsAction="withText" />
</menu>

または

<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=".MainActivity">
    <item
        Android:id="@+id/action_create_alarm"
        Android:icon="@drawable/ic_action_accept"
        Android:orderInCategory="100"
        Android:title="@string/menu_create_alarm"
        Android:showAsAction="always|withText" />
</menu>

プログラムで設定しようとしました

@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){
        MenuItem item = menu.add(R.string.menu_create_alarm);
        item.setShowAsAction(MenuItem.SHOW_AS_ACTION_WITH_TEXT|MenuItem.SHOW_AS_ACTION_IF_ROOM);
        item.setIcon(R.drawable.ic_action_accept);
        item.setOnMenuItemClickListener(
            new OnMenuItemClickListener(){

                @Override
                public boolean onMenuItemClick(MenuItem item){
                    saveAlarm();
                    return true;
                }
            }
        );


//      inflater.inflate(R.menu.menu_create_alarm, menu);
        super.onCreateOptionsMenu(menu, inflater);

    }

または

<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=".MainActivity">
    <item
        Android:id="@+id/action_create_alarm"
        Android:icon="@drawable/ic_action_accept"
        Android:orderInCategory="100"
        Android:title="@string/menu_create_alarm"
        Android:showAsAction="always|withText"
        app:showAsAction="always|withText" />
</menu>

ただし、アイコンのみが表示されます。そして、私はツールバーのタイトルを設定しなかったので、部屋のプランティがあります。メニューを削除し、ツールバー内のボタンでそれらを置き換えることはできません。
テキストの表示方法

27
Yarh

メニュータグに_tools:context="your class"_を追加する必要があります

menu.xml

_<?xml version="1.0" encoding="utf-8"?>
<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=".activities.BaseActivity">


   <item
       Android:id="@+id/action_notification1"
       Android:icon="@drawable/three"
       Android:title="action_notification"
       app:showAsAction="always">
       <menu>
           <item
               Android:id="@+id/profile"
               Android:icon="@drawable/profile"
               Android:orderInCategory="100"
               Android:title="PROFILE" />

           <item
               Android:id="@+id/c"
               Android:icon="@drawable/correct_tick"
               Android:orderInCategory="100"
               Android:title="COMPLETED TRIPS" />

           <item
               Android:id="@+id/app"
               Android:icon="@drawable/report_issue"
               Android:orderInCategory="100"
               Android:title="REPORT ISSUES" />
           <item
               Android:id="@+id/r"
               Android:icon="@drawable/correct_tick"
               Android:orderInCategory="100"
               Android:title="REACHED CENTER" />


           <item
               Android:id="@+id/pdf"
               Android:icon="@drawable/pdf_image"
               Android:orderInCategory="100"
               Android:title="BAG INFO" />
           <item
               Android:id="@+id/l"
               Android:icon="@drawable/logout"
               Android:orderInCategory="100"
               Android:title="LOGOUT" />
       </menu>
   </item>


</menu>
_

onCreateOptionsMenu()メソッドのオーバーライド

_@Override 
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu); 
    menu.getItem(0).getSubMenu().getItem(3).setVisible(false);
    menu.getItem(0).getSubMenu().getItem(4).setVisible(true);
    return super.onCreateOptionsMenu(menu);
} 
_

メニュータグに_tool:context_を記述して実行すると、テキストの前にアイコンが表示されます。

23
Raj Kumar
@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_patient_home_screen, menu);


        menu.add(0, 1, 1, menuIconWithText(getResources().getDrawable(R.mipmap.user_2), getResources().getString(R.string.action_profile)));
        menu.add(0, 2, 2, menuIconWithText(getResources().getDrawable(R.mipmap.add_user), getResources().getString(R.string.action_add_user)));
        menu.add(0, 3, 3, menuIconWithText(getResources().getDrawable(R.mipmap.switch_profile), getResources().getString(R.string.action_switch_profile)));
        menu.add(0, 4, 4, menuIconWithText(getResources().getDrawable(R.mipmap.logout), getResources().getString(R.string.action_sign_out)));
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        switch (item.getItemId()) {
            case 1:
                Toast.makeText(PatientHomeScreen.this, "Profile is Clicked", Toast.LENGTH_SHORT).show();
                return true;
            case 2:
                Toast.makeText(PatientHomeScreen.this, "Add New User is Clicked", Toast.LENGTH_SHORT).show();
                return true;
            case 3:
                Toast.makeText(PatientHomeScreen.this, "Switch Profile is Clicked", Toast.LENGTH_SHORT).show();
                return true;
            case 4:
                Toast.makeText(PatientHomeScreen.this, "Sign Out is Clicked", Toast.LENGTH_SHORT).show();
                return true;
        }

        return super.onOptionsItemSelected(item);
    }

    private CharSequence menuIconWithText(Drawable r, String title) {

        r.setBounds(0, 0, r.getIntrinsicWidth(), r.getIntrinsicHeight());
        SpannableString sb = new SpannableString("    " + title);
        ImageSpan imageSpan = new ImageSpan(r, ImageSpan.ALIGN_BOTTOM);
        sb.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        return sb;
    }

Screen shot of emulator

これがあなたを助けることを願っています

19
Harshal Pathak
protected boolean onPrepareOptionsPanel(View view, Menu menu) {
    if (menu != null) {
        if (menu.getClass().getSimpleName().equals("MenuBuilder")) {
            try {
                Method m = menu.getClass().getDeclaredMethod(
                        "setOptionalIconsVisible", Boolean.TYPE);
                m.setAccessible(true);
                m.invoke(menu, true);
            } catch (Exception e) {
                Log.e(getClass().getSimpleName(),
                        "onMenuOpened...unable to set icons for overflow menu",
                        e);
            }
        }
    }
    return super.onPrepareOptionsPanel(view, menu);
}
12
Ravi Yadav

Dev_ryから answer に追加すると、制限されたAPI警告をキャストして抑制するだけで、リフレクションを使用せずにはるかにスムーズな方法があります。

import Android.support.v7.view.menu.MenuBuilder;

@SuppressLint("RestrictedApi")
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (menu instanceof MenuBuilder) {
        ((MenuBuilder) menu).setOptionalIconsVisible(true);
    }
    getMenuInflater().inflate(R.menu.menu, menu);
    return super.onCreateOptionsMenu(menu);
}
10
Maxr1998

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=".MainActivity">
    <item
        Android:id="@+id/action_create_alarm"
        Android:icon="@drawable/ic_action_accept"
        Android:orderInCategory="100"
        Android:title="@string/menu_create_alarm"
        Android:showAsAction="always|withText"
        app:showAsAction="always|withText" />
</menu>

Java:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    new MenuInflater(this).inflate(R.menu.menu_frg_safetybox, menu);
    super.onCreateOptionsMenu(menu, inflater);
}
8
Nicolas Tyler

'always | withText'は、十分なスペースがある場合に機能します。それ以外の場合は、アイコンのみを配置します。電話を横長モードに回転させることで確認できます。

       <item
        Android:id="@+id/action_create_alarm"
        Android:icon="@drawable/ic_launcher"
        Android:title="Save"
        app:showAsAction="always|withText"
        />
4
sm_

これら2つを一緒に試してください

app:showAsAction="always|withText"
Android:showAsAction="always|withText"
1
Elltz