android - 以编程方式更改 Android Overflow 菜单图标

标签 android android-actionbar

我一直在寻找一种以编程方式更改 android 中溢出菜单图标颜色的方法。

我找到的唯一选择是通过添加自定义样式来永久更改图标。 问题是在不久的将来,我们将需要在使用我们的应用程序期间更改此设置。

我们的应用程序是一系列在线平台的扩展,因此用户可以输入他们平台的网址。它们有自己的样式,将通过对应用程序的 API 调用来获取。

这些可能会让我改变图标的​​颜色...

目前我像这样更改 Actionbar 中的其他图标:

if (ib != null){
            Drawable resIcon = getResources().getDrawable(R.drawable.navigation_refresh);
            resIcon.mutate().setColorFilter(StyleClass.getColor("color_navigation_icon_overlay"), PorterDuff.Mode.SRC_ATOP);
            ib.setIcon(resIcon);
}

现在我必须使用样式。

最佳答案

您实际上可以使用一些小技巧以编程方式更改溢出图标。这是一个例子:

为溢​​出菜单创建样式并传入内容描述

<style name="Widget.ActionButton.Overflow" parent="@android:style/Widget.Holo.ActionButton.Overflow">
    <item name="android:contentDescription">@string/accessibility_overflow</item>
</style>

<style name="Your.Theme" parent="@android:style/Theme.Holo.Light.DarkActionBar">
    <item name="android:actionOverflowButtonStyle">@style/Widget.ActionButton.Overflow</item>
</style>

现在调用ViewGroup.findViewsWithText并传递您的内容描述。所以,像这样:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // The content description used to locate the overflow button
    final String overflowDesc = getString(R.string.accessibility_overflow);
    // The top-level window
    final ViewGroup decor = (ViewGroup) getWindow().getDecorView();
    // Wait a moment to ensure the overflow button can be located
    decor.postDelayed(new Runnable() {

        @Override
        public void run() {
            // The List that contains the matching views
            final ArrayList<View> outViews = new ArrayList<>();
            // Traverse the view-hierarchy and locate the overflow button
            decor.findViewsWithText(outViews, overflowDesc,
                    View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
            // Guard against any errors
            if (outViews.isEmpty()) {
                return;
            }
            // Do something with the view
            final ImageButton overflow = (ImageButton) outViews.get(0);
            overflow.setImageResource(R.drawable.ic_action_overflow_round_red);

        }

    }, 1000);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Add a dummy item to the overflow menu
    menu.add("Overflow");
    return super.onCreateOptionsMenu(menu);
}

View.findViewsWithText 是在 API 级别 14 中添加的,因此您必须使用自己的兼容性方法:

static void findViewsWithText(List<View> outViews, ViewGroup parent, String targetDescription) {
    if (parent == null || TextUtils.isEmpty(targetDescription)) {
        return;
    }
    final int count = parent.getChildCount();
    for (int i = 0; i < count; i++) {
        final View child = parent.getChildAt(i);
        final CharSequence desc = child.getContentDescription();
        if (!TextUtils.isEmpty(desc) && targetDescription.equals(desc.toString())) {
            outViews.add(child);
        } else if (child instanceof ViewGroup && child.getVisibility() == View.VISIBLE) {
            findViewsWithText(outViews, (ViewGroup) child, targetDescription);
        }
    }
}

结果

Example

关于android - 以编程方式更改 Android Overflow 菜单图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22046903/

相关文章:

java - 函数和可运行对象同时工作(如何?)(Android、Java)

android - 如何将库项目添加到 Android Studio?

Android - 无法设计支持 API 16 至 22 的 ActionBar

android - 选择多个项目时动态隐藏上下文操作栏 (CAB) 中的项目

android - ActionBarCompat : java. lang.IllegalStateException : You need to use a Theme. AppCompat

android - 如何拦截ActionBarSherlock中 "Up"(主页按钮)按钮的点击?

android - 在固定时间间隔后调用特定方法

android - 使用 OpenCV 设置 Android

android - 向下拖动时,Android List View 动画

Android可点击透明工具栏