如何动态更改 OverflowButton 的按下状态背景

how to dynamically change OverflowButton's background for press state

具有 android.support.v7.widget.Toolbar 并且它的背景颜色会根据不同的情况而变化。 溢出按钮按钮(工具栏右侧的三个垂直点)在按下时始终具有相同的背景。

看到一些关于如何静态更改的帖子,如下引述。但真正想要的是根据工具栏的背景颜色动态地做。

有什么想法吗?

change statically

您可以使用以下样式声明更改用于它的图像。

<style name="MyCustomTheme" parent="style/Theme.Holo">
    <item name="android:actionOverflowButtonStyle">@style/MyCustomTheme.OverFlow</item>
</style>

<style name="MyCustomTheme.OverFlow">
    <item name="android:src">@drawable/my_overflow_image</item>
</style>

如果您使用的是 ActionBarSherlock,请按以下步骤操作

<style name="MyCustomTheme" parent="style/Theme.Sherlock">
    <item  name="android:actionOverflowButtonStyle">@style/MyCustomTheme.OverFlow</item>
    <item name="actionOverflowButtonStyle">@style/MyCustomTheme.OverFlow</item>
</style>

<style name="MyCustomTheme.OverFlow">
    <item name="android:src">@drawable/my_overflow_image</item>
</style>

编辑--答案应该是: 只需在actionOverflowButtonStyle样式中设置部分透明背景即可实现,这样工具栏的任何颜色都会被混合。

一个解决方案可能只是通过使其对所有工具栏透明来禁用按下状态,但这是不可取的。

找到了另一个,但感觉像是 hack。 不确定是否有人有更好的方法来访问溢出按钮,以便可以使用适当的 drawable 动态设置它的背景。

来自 this bug report

可以按照下面的setupOverflowMenuButton()来完成。

public boolean setupOverflowMenuButton (Menu menu, Toolbar toolbar) {
    Toolbar t = toolbar;
    for(int i = 0; i < t.getChildCount(); i++) {
        if(t.getChildAt(i) instanceof ActionMenuView) {
            ActionMenuView v = (ActionMenuView)t.getChildAt(i);
            for(int j = 0; j < v.getChildCount(); j++) {
                if(v.getChildAt(j) instanceof TintImageView) {
                    TintImageView v1 = (TintImageView)v.getChildAt(j);

v1.setBackgroundResource(R.drawable.overflow_bt_bg_selector);
                 }
            }
        }
    }
    return super.onPrepareOptionsMenu(menu);
}