代码之家  ›  专栏  ›  技术社区  ›  Cory Charlton

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

  •  9
  • Cory Charlton  · 技术社区  · 9 年前

    我正在尝试放置 SlidingTabLayout 在我的 android.support.v7.widget.Toolbar 但由于某些原因,在纵向布局中有额外的顶部和底部填充。如此屏幕截图所示:

    Portrait

    在景观布局中 android.support.v7.widget.Toolbar 较短,多余的填充物消失:

    Landscape

    我知道 contentInsertStart 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>
    

    如注释所示,如果我手动设置 android.support.v7.widget.Toolbar 至48dp,然后 滑动选项卡布局 填写,但这里有两个问题:

    1. 工具栏与标准工具栏的高度不同,这在更改活动时很明显。
    2. 中的图标 Toolbar 如果我改变它的高度,它不再垂直居中

    所以正如标题所说,如何从android.support.v7.widget.Toolbar中删除顶部和底部填充?

    1 回复  |  直到 9 年前
        1
  •  8
  •   Cory Charlton    9 年前

    好吧,所以@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 实际上填满了整个高度。我之所以注意到这一点,是因为我为调试设置了粉色背景。

    我最初错过这一点的原因是下划线指示器仍然不在底部(如原始问题中的屏幕截图所示)。我必须对 滑动选项卡布局 代码:

    原件:

    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_CONTENT LayoutParams.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;
    }