如何在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> 

但是,只有图标出现。 并且有房间的plant,,因为我没有设置工具栏的标题。 删除菜单并用工具栏中的buttonreplace菜单是不可修改的。
如何显示文字?

Solutions Collecting From Web of "如何在AppCompatActivity中使用图标和文本显示菜单项"

你需要添加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); } 

你把写作工具:上下文菜单标签然后运行你会得到你的文字的图标

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

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

模拟器的屏幕截图

希望对你有帮助

尝试这两个在一起

 app:showAsAction="always|withText" android:showAsAction="always|withText" 

如果有足够的空间, “always | withText”将起作用,否则它将只放置图标。您将看到通过将手机旋转到横向模式。

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

添加到dev_ry的答案 ,没有使用reflection,只是铸造和压制受限制的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); }