【问题标题】:Disabled menuItem?禁用菜单项?
【发布时间】:2020-12-10 09:12:17
【问题描述】:

好心人!告诉我如何制作具有适当外观的禁用菜单项之类的基本事物,例如材料设计中的示例?以编程方式。提前谢谢你

编辑:以下示例将禁用点击,但不会根据材料设计更改外观:

代码示例:

@Override
public void onPrepareOptionsMenu(@NonNull Menu menu) {
    super.onPrepareOptionsMenu(menu);
        MenuItem menuItem = menu.findItem(R.id.someItem);
        menuItem.setEnable(false);
}

Xml 示例:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/someItem"
        android:enabled="false"
        android:title="Some title" />
</menu>

【问题讨论】:

  • 也许设置disabled属性(MenuItem继承它)!?
  • 我尝试使用menuItem.setEnabled(false);,但它并没有改变外观:(
  • 你能提供一些代码你如何膨胀菜单,并得到这个项目
  • onCreateOptionsMenu 中使用相同的代码在用inflater.inflate() 膨胀后得到相同的结果吗?
  • 同样...该项目被禁用但不像图像中那样模糊。显然这根本不是android提供的,很奇怪

标签: java android menu material-design


【解决方案1】:

您可以像这样在运行时添加、删除或禁用菜单项并更改菜单项的文本颜色:

如果要根据活动生命周期中发生的事件修改选项菜单,可以在 onPrepareOptionsMenu() 方法中进行。此方法向您传递当前存在的 Menu 对象,以便您可以对其进行修改,例如添加、删除或禁用项目。 (Fragments 还提供了一个 onPrepareOptionsMenu() 回调。)

在 Android 2.3.x 及更低版本上,每次用户打开选项菜单(按下菜单按钮)时,系统都会调用 onPrepareOptionsMenu()。

在 Android 3.0 及更高版本上,当应用栏中显示菜单项时,选项菜单被视为始终处于打开状态。当一个事件发生,你想执行一个菜单更新时,你必须调用invalidateOptionsMenu()来请求系统调用onPrepareOptionsMenu()。

你可以看到the Documentation

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
    android:id="@+id/someItem"
    android:enabled="false"
    android:title="Some title"
    app:actionViewClass="android.support.v7.widget.TextView" 
    // if using androidX
    //app:actionViewClass="androidx.appcompat.widget.AppCompatTextView"/>
 </menu>

在java代码中

 //sample code
 @Override
 public boolean onPrepareOptionsMenu (Menu menu) {
   //disable menu item and change text color
   MenuItem menu1 = menu.findItem(R.id.yourmenuid);
   menu1.setEnabled(false);
   TextView textView = (TextView) menu1.getActionView();
   textView.setTextColor(Color.BLACK);
   return true;
  }

您必须调用 invalidateOptionsMenu() 来请求系统调用 onPrepareOptionsMenu()。

【讨论】:

  • 这不是问题。问题是项目的外观保持不变。它与示例材料设计中的不同
  • @ДенисВережников 请立即查看。
  • 试了很久。不成功...找到了textview本身,但由于某种原因没有显示
【解决方案2】:

我找到了如何更改菜单项中文本颜色的解决方法。非常可悲的是,没有开箱即用地提供这样一个基本的东西。也许有人有更好的解决方案,我会很高兴看到!

MenuItem  menuItem = menu.findItem(R.id.some_item);
menuItem.setEnabled(false);
SpannableString s = new SpannableString(menuItem.getTitle());
s.setSpan(new ForegroundColorSpan(Color.GRAY), 0, s.length(), 0);
menuItem.setTitle(s);

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    相关资源
    最近更新 更多