如何覆盖操作栏菜单项的内容描述?

How to override content description for an Action Bar MenuItem?

我有一个 ActionBar,我在 Activity 的 onCreateOptionsMenu(Menu) 方法中为其添加了几个 MenuItems 对象。但我需要覆盖其中一项的内容描述。

我一直在考虑在 XML 中定义 MenuItem 并设置 actionViewClass 属性。回到源代码,为 MenuItem 调用 MenuItem.getActionView(),就像 http://developer.android.com/training/appbar/action-views.html 中描述的那样。这样我就可以在 View 对象上调用 setContentDescription() returns。但我宁愿不使用 XML 文件。

除了使用 XML 选项之外,还有其他想法吗?

好的,我知道了。幸运的是,我不必转向 XML 替代方案。我必须做的是创建一个新的 View 对象,然后 apply it as the MenuItem's actionView。困难的部分实际上是将视图对象设置为当前主题的任何普通 MenuItem 的样式(如果我在不使用 actionView 的情况下添加它)。按照代码片段(假设我的 activity 的名称是 MyActivity):

    public boolean onCreateOptionsMenu(Menu menu) {
        Button buttonView = new Button(this, null, android.R.attr.actionButtonStyle);
        if (Build.VERSION.SDK_INT < 23) {
            buttonView.setTextAppearance(this, android.R.style.TextAppearance_DeviceDefault_Widget_ActionBar_Menu);
        } else {
            buttonView.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Widget_ActionBar_Menu);
        }
        buttonView.setText(R.string.option_title); // button label
        buttonView.setContentDescription("Content description");
        buttonView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View view) {
                MyActivity.this.onOptionsItemSelected(item);
            }
        });

        MenuItem item = menu.add(R.string.option_title);
        item.setActionView(buttonView);
        ...
        return super.onCreateOptionsMenu(menu);
    }

我最近不得不为我的应用程序做这件事,选择的答案对我有帮助,在 Kotlin 中发布选择的答案:

val profileIcon = ImageButton(context)
profileIcon.setImageResource(R.drawable.icon_profile)
profileIcon.background = null
profileIcon.contentDescription = "Profile"
val item: MenuItem = menu.add("Profile")
item.setShowAsAction(SHOW_AS_ACTION_ALWAYS)
item.actionView = profileIcon
profileIcon.setOnClickListener {
    onOptionsItemSelected(item)
}
super.onCreateOptionsMenu(menu, inflater)