以编程方式更改 Android 溢出菜单图标 [英] Changing the Android Overflow menu icon programmatically
问题描述
我一直在寻找一种方法来以编程方式更改 android 中溢出菜单图标的颜色.
I've been looking for a method to programmatically change the color of the overflow menu icon in android.
我发现的唯一选择是通过添加自定义样式来永久更改图标.问题是在不久的将来,我们将需要在使用我们的应用程序期间更改此设置.
The only option I have found is to change the icon permanently by adding a custom style. The problem is that in the nearby future we will need to change this during the use of our app.
我们的应用是一系列在线平台的扩展,因此用户可以输入他们平台的网址.这些有自己的样式,将通过对应用程序的 API 调用获取.
Our app is an extension to a series of online-platforms and therefore a user can enter their platform's web-url. These have their own styles and will be fetched by an API call towards the app.
这些可能会让我改变图标的颜色...
These might adress me to change the color of the icon...
目前我更改了操作栏中的其他图标,如下所示:
Currently I change other icons in the Actionbar like this:
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);
}
现在我必须使用样式.
推荐答案
实际上,您可以使用一个小技巧以编程方式更改溢出图标.举个例子:
You actually can programmatically change the overflow icon using a little trick. Here's an example:
为溢出菜单创建样式并传入内容描述
<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
并传入您的内容描述.所以,就像:
Now call ViewGroup.findViewsWithText
and pass in your content description. So, something like:
@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 中添加的,因此您必须使用自己的兼容性方法:
View.findViewsWithText
was added in API level 14, so you'll have to use your own compatibility method:
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);
}
}
}
结果
这篇关于以编程方式更改 Android 溢出菜单图标的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!