如何在 AppCompatActivity 中显示带有图标和文本的菜单项
How to display menu item with icon and text in 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>
但是,只有图标出现。还有很多空间,因为我没有设置工具栏标题。删除菜单并用工具栏内的按钮替换它们是不合适的。
如何显示文字?
一起试试这两个
app:showAsAction="always|withText"
android:showAsAction="always|withText"
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);
}
如果有足够的空间,'always|withText' 将起作用,否则它将仅放置 icon.You 并通过旋转 phone 来查看横屏模式..
<item
android:id="@+id/action_create_alarm"
android:icon="@drawable/ic_launcher"
android:title="Save"
app:showAsAction="always|withText"
/>
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);
}
您需要将 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
写入菜单标签,然后 运行 您将在文本之前看到图标。
@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;
}
希望对您有所帮助
从 dev_ry 添加到 ,有一种不使用反射的更流畅的方法,只需投射和抑制受限的 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);
}
MyActivity.java:
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.my_menu, menu);
View view = menu.findItem(R.id.whats_this).getActionView();
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// do something
}
});
return super.onCreateOptionsMenu(menu);
}
my_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=".MyActivity">
<item
android:id="@+id/item"
app:actionLayout="@layout/my_layout"
android:orderInCategory="100"
android:title="@string/whats_this"
app:showAsAction="always" />
</menu>
my_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="30dp"
android:paddingLeft="5dp"
android:gravity="center_vertical"
android:textStyle="bold"
android:textColor="@color/white"
android:text="@string/whats_this"/>
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@mipmap/question"/>
</LinearLayout>
您可以使用以下代码来确定您的目的。无需使其程序化。您可以在 menu.xml 文件中进行欺骗。
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">
<item
android:id="@+id/overflowMenu"
android:icon="@drawable/ic_more_vert_white_24dp"
android:title=""
app:showAsAction="always">
<menu>
<item
android:id="@+id/menuWithIconText"
android:icon="@drawable/chosen_icon"
android:title="@string/menu_item_title"
/>
</menu>
</item>
在上面的代码中,我们在 item
中使用了 menu
。在内部菜单中,我们已经用图标定义了我们想要的溢出菜单。请记住在外部 item
标签中使用 app:showAsAction="always"
。
我在 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>
但是,只有图标出现。还有很多空间,因为我没有设置工具栏标题。删除菜单并用工具栏内的按钮替换它们是不合适的。
如何显示文字?
一起试试这两个
app:showAsAction="always|withText"
android:showAsAction="always|withText"
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);
}
'always|withText' 将起作用,否则它将仅放置 icon.You 并通过旋转 phone 来查看横屏模式..
<item
android:id="@+id/action_create_alarm"
android:icon="@drawable/ic_launcher"
android:title="Save"
app:showAsAction="always|withText"
/>
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);
}
您需要将 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
写入菜单标签,然后 运行 您将在文本之前看到图标。
@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;
}
希望对您有所帮助
从 dev_ry 添加到
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);
}
MyActivity.java:
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.my_menu, menu);
View view = menu.findItem(R.id.whats_this).getActionView();
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// do something
}
});
return super.onCreateOptionsMenu(menu);
}
my_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=".MyActivity">
<item
android:id="@+id/item"
app:actionLayout="@layout/my_layout"
android:orderInCategory="100"
android:title="@string/whats_this"
app:showAsAction="always" />
</menu>
my_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="30dp"
android:paddingLeft="5dp"
android:gravity="center_vertical"
android:textStyle="bold"
android:textColor="@color/white"
android:text="@string/whats_this"/>
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@mipmap/question"/>
</LinearLayout>
您可以使用以下代码来确定您的目的。无需使其程序化。您可以在 menu.xml 文件中进行欺骗。
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">
<item
android:id="@+id/overflowMenu"
android:icon="@drawable/ic_more_vert_white_24dp"
android:title=""
app:showAsAction="always">
<menu>
<item
android:id="@+id/menuWithIconText"
android:icon="@drawable/chosen_icon"
android:title="@string/menu_item_title"
/>
</menu>
</item>
在上面的代码中,我们在 item
中使用了 menu
。在内部菜单中,我们已经用图标定义了我们想要的溢出菜单。请记住在外部 item
标签中使用 app:showAsAction="always"
。