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