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

时间:2015-03-24 17:32:49

标签: android android-layout android-custom-view android-toolbar android-actionbaractivity

我在这里找到了很多与工具栏相关的答案,但没有一个答案可以帮助我。

我想要实现的是拥有一个扩展的工具栏,它将显示一个徽标,可能是一个活动/应用程序的名称,它将有一个动作按钮/抽屉切换到右侧,将显示一个导航右边的抽屉,带有其他选项的溢出菜单,如设置和底部的导航标签,允许用户在不同的片段(一个月中的不同日期)之间移动。

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

    <?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的文本视图,因此它会延伸整个可用空间。并且高度为72dp。

现在在我的BaseActivity XML中,我将工具栏包含在主要上下文的Framelayout中(否则工具栏将覆盖整个屏幕,原因不明(对我而言,花了我很多时间))

<...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中的原始大小。黑色表示运行应用程序时的大小。

Design View of the toolbar

感谢您的帮助。

相关问题可能对遇到此问题以解决类似问题的人有用:

3 个答案:

答案 0 :(得分:17)

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

因为我没有给第二个工具栏中的任何菜单项充气,所以我所有的cusotm视图都按照需要运行。

这些行仍然需要使用

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

这解决了我的问题所以现在我将两个工具栏包含在我的XMl中。

答案 1 :(得分:5)

从设计支持库的第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>

enter image description here

答案 2 :(得分:1)

来自Toolbar文档:

  

一个或多个自定义视图。应用程序可能会添加任意子项   工具栏的视图。他们将出现在这个位置   布局。如果子视图的Toolbar.LayoutParams表示重力   值为CENTER_HORIZONTAL的视图将尝试居中   所有其他元素都有后,工具栏中剩余的可用空间   被测量了。

因此,从它的外观来看,您的自定义视图的行为应该如此。选项菜单占用工具栏中的一定空间,因此工具栏会测量自定义视图的剩余空间。