更改工具栏高度后如何将菜单项对齐 center_vertical

How to align menu item to center_vertical after changed the height of toolbar

更改(减少)工具栏的高度(wrap_content 到 40dp)后,标题仍然是 center_vertical,但菜单项偏向底部。怎么修?谢谢。

代码:

toolbar.inflateMenu(R.menu.menu_toolbar);

XML:(如果我不改layout_height="40dp",那没问题)

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:layout_alignParentEnd="true"
    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true"
    android:layout_centerInParent="true"
    android:background="?attr/colorAccent"
    android:minHeight="?attr/actionBarSize"
    app:contentInsetEnd="0dp"
    app:contentInsetStart="0dp"
    app:titleTextAppearance="@style/Toolbar.TitleText" />

菜单项XML:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity"
android:gravity="end|center">
<item
    android:id="@+id/action_add"
    android:icon="@drawable/ic_add_black_24dp"
    android:orderInCategory="10"
    android:title="添加"
    app:showAsAction="always" />
<item
    android:id="@+id/action_delete"
    android:icon="@drawable/ic_remove_black_24dp"
    android:orderInCategory="10"
    android:title="删除"
    app:showAsAction="always" />

<item
    android:id="@+id/action_start"
    android:icon="@drawable/ic_play_arrow_black_24dp"
    android:orderInCategory="10"
    android:title="开启"
    app:showAsAction="always" />

<item
    android:id="@+id/action_stop"
    android:icon="@drawable/ic_stop_black_24dp"
    android:orderInCategory="10"
    android:title="停止"
    app:showAsAction="always" />

</menu>

[工具栏]

您的问题是 Toolbar.There 的默认行为没有正式 api 将图标设置为垂直居中。

以下代码为非官方方式

public class CustomToolbar extends Toolbar {

    public CustomToolbar(Context context) {
        super(context);
    }

    public CustomToolbar(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomToolbar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);

        for(int i = 0; i < getChildCount(); i++) {
            View child = getChildAt(i);
            if (child instanceof ActionMenuView) {
                child.setTop(0); // FIXME: Move child in vertically center to be exact
            }
        }
    }
}

在您的布局中:

<{replace here with package name}.CustomToolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorAccent"
        ... />