我用过两种方法来获取Toolbar
的导航按钮视图。第一个在Toolbar
类上使用反射,第二个迭代 aToolbar
的孩子View
s 直到找到一个ImageButton
。
反射法:
private View getNavButtonView(Toolbar toolbar) {
try {
Class<?> toolbarClass = Toolbar.class;
Field navButtonField = toolbarClass.getDeclaredField("mNavButtonView");
navButtonField.setAccessible(true);
View navButtonView = (View) navButtonField.get(toolbar);
return navButtonView;
}
catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
和迭代方法:
private View getNavButtonView(Toolbar toolbar) {
for (int i = 0; i < toolbar.getChildCount(); i++)
if (toolbar.getChildAt(i) instanceof ImageButton)
return toolbar.getChildAt(i);
return null;
}
请注意,如果使用迭代方法,则应在设置 Navigation Icon 后立即调用,应在View
添加或设置任何其他 s之前调用Toolbar
。
在我们得到 之后View
,我们只需要OnLongClickListener
在它上面设置一个,并显示Toast
一个适当的偏移量。例如:
toolbar.setNavigationIcon(R.drawable.ic_launcher);
View navButtonView = getNavButtonView(toolbar);
if (navButtonView != null) {
navButtonView.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Toast toast = Toast.makeText(v.getContext(),
"Navigation Button View",
Toast.LENGTH_SHORT);
int[] loc = new int[2];
v.getLocationOnScreen(loc);
toast.setGravity(Gravity.TOP | Gravity.LEFT,
loc[0] + v.getWidth() / 2,
loc[1] + v.getHeight() / 2);
toast.show();
return true;
}
}
);
}