带有自定义视图的扩展工具栏未以全宽显示

Extended Toolbar with Custom View not Displaying with Full Width

我在这里浏览了很多与工具栏相关的答案,但 none 的答案可以帮助我。

我想要实现的是有一个扩展的工具栏,它将显示一个徽标,可能是 Activity/App 的名称,它会有一个动作 button/drawer 向右切换将在右侧显示一个类似导航的抽屉,一个带有其他选项(如设置)的溢出菜单,以及底部的一个导航选项卡,允许用户在不同的片段(一个月中的不同日期)之间移动。

我试图实现这一点的方法是通过工具栏。 首先我创建工具栏并添加我的自定义视图。

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v7.widget.Toolbar
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/toolbar_actionbar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/min_double_toolbar_height"
        app:theme="@style/ThemeOverlay.AppCompat.ActionBar"
        android:minHeight="?attr/actionBarSize"
        android:background="@color/primary"

        app:contentInsetStart="0dp"
        app:contentInsetEnd="0dp"
        app:contentInsetLeft="0dp"
        app:contentInsetRight="0dp"
        android:clipToPadding="false"
        >
        <!-- ThemeOVerlay Makes sure the text and items are using solid colors-->

        <include
            android:layout_width="match_parent"
            android:layout_height="72dp"
            android:layout_gravity="bottom"
            layout="@layout/day_navigation_tab"
            />

    </android.support.v7.widget.Toolbar>

day_navigation_tab 只是一个水平视图,两个图像视图具有 72dp 的填充(按照指南)和一个布局权重设置为 1 的文本视图,因此它延伸到整个可用 space。高度为 72dp。

现在,在我的 BaseActivity XML 中,我将工具栏包含在主上下文的框架布局中(否则工具栏会因我未知的原因覆盖整个屏幕(我花了很长时间才弄明白))

<...ommited>

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <include
            android:id="@+id/toolbar"
            layout="@layout/app_bar"
            />
    </FrameLayout>

    <!-- android:layout_gravity="start" tells DrawerLayout to treat
         this as a sliding drawer on the left side for left-to-right
         languages and on the right side for right-to-left languages.
         If you're not building against API 17 or higher, use
         android:layout_gravity="left" instead. -->
    <!-- The drawer is given a fixed width in dp and extends the full height of
         the container. -->
    <fragment android:id="@+id/navigation_drawer"
              android:layout_width="@dimen/navigation_drawer_width"
              android:layout_height="match_parent"
              android:layout_gravity="right"
              android:name="alterway.agency.timeentry.NavigationDrawerFragment"
              tools:layout="@layout/fragment_navigation_drawer"
              app:layout="@layout/fragment_navigation_drawer"
    />


</android.support.v4.widget.DrawerLayout>

但是,当我使用工具栏时,我在 onCreateOptionsMenu 的 actionBar 上膨胀菜单,我的自定义视图缩小并且不会扩展创建的选项的边缘。 下面的图片更好地说明了这一点,它是 Android Studio 中设计视图的屏幕截图。 黄色矩形表示将放置选项项的位置。 紫色表示 DesignView 中的原始大小。黑色表示 运行 app.

时的大小

感谢您的帮助。

可能对遇到此问题并希望解决类似问题的任何人有用的相关问题:

来自 Toolbar 文档:

One or more custom views. The application may add arbitrary child views to the Toolbar. They will appear at this position within the layout. If a child view's Toolbar.LayoutParams indicates a Gravity value of CENTER_HORIZONTAL the view will attempt to center within the available space remaining in the Toolbar after all other elements have been measured.

因此,从外观上看,您的自定义视图运行正常。选项菜单在您的工具栏中占用了一定数量的 space,因此工具栏正在测量剩余的 space 以适合您的自定义视图。

因此,为了实现这一点并完全控制工具栏中的填充,我创建了两个工具栏。第一个工具栏的标准高度为 56dp,第二个工具栏的高度为 72dp,它们一起构成了 material 设计指定的双层工具栏。

并且因为我没有在第二个工具栏中展开任何菜单项,所以我内部的所有自定义视图都按预期运行。

这些行仍然需要使用

    app:contentInsetStart="0dp"
    app:contentInsetEnd="0dp"
    app:contentInsetLeft="0dp"
    app:contentInsetRight="0dp"
    android:clipToPadding="false"

这解决了我的问题,所以现在我在 XMl 中加入了两个工具栏。

从设计支持库的第 23 版开始,使用 android.support.design.widget.CoordinatorLayout

可以更简单地完成此操作

这是一个例子:

<android.support.design.widget.CoordinatorLayout 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:popupTheme="@style/AppTheme.PopupOverlay">            
        </android.support.v7.widget.Toolbar>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/project_light_green"
            android:orientation="horizontal"
            android:paddingLeft="@dimen/activity_horizontal_margin_half"
            android:paddingRight="@dimen/activity_horizontal_margin_half"
            android:paddingTop="@dimen/activity_vertical_margin_half">

            <ImageView
                android:layout_width="24dp"
                android:layout_height="24dp"
                android:layout_margin="12dp"
                android:src="@drawable/ic_search_24dp" />

            <EditText
                android:id="@+id/search_field"
                android:layout_width="0dp"
                android:layout_height="48dp"
                android:layout_weight="1"
                android:background="@null"
                android:hint="@string/autocomplete_hint"
                android:singleLine="true"
                android:textColor="@color/project_black"
                android:textColorHint="@color/project_dark_gray"/>

            <include layout="@layout/close_button"
                android:id="@+id/clearButton"/>

        </LinearLayout>

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_search_location" />

</android.support.design.widget.CoordinatorLayout>