android menu改icon,以编程方式更改Android Overflow菜单图标

郑声
2023-12-01

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

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

@string/accessibility_overflow

@style/Widget.ActionButton.Overflow

现在调用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 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 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);

}

}

}

 类似资料: