导航图标吐司提示

时间:2015-12-03 22:47:15

标签: android android-toolbar navigationitem

Android工具栏菜单项在长按时显示吐司提示。 toast消息在xml中定义,带有“title”属性:

<item
    android:id="@+id/openRightMenu"
    android:orderInCategory="300"
    android:title="@string/navigation_drawer_right_desc"
    android:icon="@drawable/menu24_2"
    app:showAsAction="always"
    />

我可以为工具栏的导航图标设置相同的行为吗?我使用以下代码设置图标

        toolbar.setNavigationIcon(R.drawable.locations_icon);

但我无法在此处设置说明文字

1 个答案:

答案 0 :(得分:2)

我用两种方法来获取Toolbar的导航按钮视图。第一个使用Toolbar类的反射,第二个迭代Toolbar的子View,直到找到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;
}

请注意,如果您使用迭代方法,则应在设置导航图标后立即调用该导航图标,应在View上添加或设置任何其他Toolbar之前调用该导航图标。 / p>

我们收到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;
            }
        }
    );
}