How to display menu item with icon and text in AppCompatActivity How to display menu item with icon and text in AppCompatActivity android android

How to display menu item with icon and text in AppCompatActivity


@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

Hope this will help you


You need to add tools:context="your class" to menu tag

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>

Override onCreateOptionsMenu() Method

@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);} 

You should write tool:context to menu tag then run you will get icons before your text.


Adding to the answer from dev_ry, there is a much smoother way without using reflection by just casting and suppressing the restricted API warning:

import android.support.v7.view.menu.MenuBuilder;@SuppressLint("RestrictedApi")@Overridepublic boolean onCreateOptionsMenu(Menu menu) {    if (menu instanceof MenuBuilder) {        ((MenuBuilder) menu).setOptionalIconsVisible(true);    }    getMenuInflater().inflate(R.menu.menu, menu);    return super.onCreateOptionsMenu(menu);}