如何覆盖Action Bar MenuItem的内容描述?

时间:2016-03-08 23:24:05

标签: android android-actionbar menuitem android-menu

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

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

除了使用XML选项之外,有没有人有任何想法?

2 个答案:

答案 0 :(得分:1)

好的,我已经弄清楚了。幸运的是,我没有必要转向XML替代方案。我必须做的是创建一个新的View对象,apply it as the MenuItem's actionView。实际上,困难的部分是为视图对象设置样式,因为当前主题的任何普通MenuItem都是如此(如果我在不使用actionView的情况下添加它)。关注代码段(假设我的活动名称为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);
    }

答案 1 :(得分:0)

我最近不得不为我的应用做这件事,所选的答案帮助了我,在 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)