如何从android.support.v7.widget.Toolbar中删除顶部和底部填充?

时间:2016-03-06 06:18:25

标签: android android-support-library android-toolbar android-appbarlayout

我正在尝试在form内放置一个SlidingTabLayout但由于某种原因,在纵向布局中有额外的顶部和底部填充。如截图所示:

Portrait

在横向布局中,android.support.v7.widget.Toolbar更短,额外的填充消失了:

Landscape

我知道android.support.v7.widget.ToolbarcontentInsertStart属性,但顶部和底部似乎没有任何内容。这是我的布局:

contentInsetEnd

如评论中所示,如果我手动将<android.support.design.widget.AppBarLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_height="wrap_content" android:layout_width="match_parent" android:theme="?attr/actionBarTheme" > <!-- Changing the size of the toolbar fixed the problem below but I don't like the solution since the height difference is perceptible --> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="match_parent" android:background="?attr/colorPrimary" android:padding="0dp" app:popupTheme="?attr/actionBarPopupTheme" > <!-- TODO: BUG - This isn't filling out the action bar in portrait (see note above) --> <com.myapplication.views.widgets.SlidingTabLayout android:id="@+id/sliding_tabs" android:layout_width="wrap_content" android:layout_height="match_parent" android:background="@color/pink_400" /> </android.support.v7.widget.Toolbar> </android.support.design.widget.AppBarLayout> 的高度设置为48dp,那么android.support.v7.widget.Toolbar会将其填满,但这里有两个问题:

  1. 工具栏的高度与标准工具栏的高度不同,在更改活动时会很明显。
  2. SlidingTabLayout中的图标不再垂直居中,如果我更改它的高度
  3. 正如标题所说,如何从android.support.v7.widget.Toolbar中删除顶部和底部填充?

1 个答案:

答案 0 :(得分:7)

好的,所以@RaviSravanKumar的评论帮助我解决了这个问题。当我将布局更改回:

<android.support.design.widget.AppBarLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:theme="?attr/actionBarTheme"
    >

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="?attr/actionBarPopupTheme"
        >

        <com.myapplication.views.widgets.SlidingTabLayout
            android:id="@+id/sliding_tabs"
            android:layout_width="wrap_content"
            android:layout_height="?attr/actionBarSize"
            />

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

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

当高度设置为?attr/actionBarSize时,我注意到SlidingTabLayout实际上填满了整个高度。我之所以注意到这一点是因为我为调试设置了粉红色的背景。

我之所以错过这个原因是因为下划线指标仍然不在底部(如原始问题中的屏幕截图所示)。我必须对SlidingTabLayout代码进行以下更改:

<强>原始

public SlidingTabLayout(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

    // Disable the Scroll Bar
    setHorizontalScrollBarEnabled(false);
    // Make sure that the Tab Strips fills this View
    setFillViewport(true);

    mTitleOffset = (int) (TITLE_OFFSET_DIPS * getResources().getDisplayMetrics().density);

    mTabStrip = new SlidingTabStrip(context);
    addView(mTabStrip, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
}

新功能(请注意从LayoutParams.WRAP_CONTENTLayoutParams.MATCH_PARENT的更改:

public SlidingTabLayout(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

    // Disable the Scroll Bar
    setHorizontalScrollBarEnabled(false);
    // Make sure that the Tab Strips fills this View
    setFillViewport(true);

    mTitleOffset = (int) (TITLE_OFFSET_DIPS * getResources().getDisplayMetrics().density);

    mTabStrip = new SlidingTabStrip(context);
    addView(mTabStrip, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
}

<强>原始

protected TextView createDefaultTabView(Context context) {
    TextView textView = new TextView(context);
    textView.setGravity(Gravity.CENTER);
    textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, TAB_VIEW_TEXT_SIZE_SP);
    textView.setTypeface(Typeface.DEFAULT_BOLD);
    textView.setLayoutParams(new LinearLayout.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));

    TypedValue outValue = new TypedValue();
    getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground,
            outValue, true);
    textView.setBackgroundResource(outValue.resourceId);

    if (Build.VERSION.SDK_INT >= 14) {
        textView.setAllCaps(true);
    }

    int padding = (int) (TAB_VIEW_PADDING_DIPS * getResources().getDisplayMetrics().density);
    textView.setPadding(padding, padding, padding, padding);

    return textView;
}

新:(请注意布局参数和填充的更改)

protected TextView createDefaultTabView(Context context) {
    TextView textView = new TextView(context);
    textView.setGravity(Gravity.CENTER);
    textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, TAB_VIEW_TEXT_SIZE_SP);
    textView.setTypeface(Typeface.DEFAULT_BOLD);
    textView.setLayoutParams(new LinearLayout.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT));

    TypedValue outValue = new TypedValue();
    getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground,
            outValue, true);
    textView.setBackgroundResource(outValue.resourceId);

    if (Build.VERSION.SDK_INT >= 14) {
        textView.setAllCaps(true);
    }

    int padding = (int) (TAB_VIEW_PADDING_DIPS * getResources().getDisplayMetrics().density);
    textView.setPadding(padding, 0, padding, 0);

    return textView;
}