學習toolbar,發(fā)現(xiàn)toolbar的默認高度有點高,本來以為是個很快就能解決的問題,結果看遍網(wǎng)上各種文章,各種嘗試都不成功,于是自己好好研究了下。在此分享下,希望大家都有收獲。
通過查看android的toolbar style可以得知,toolbar的最小高度是由android:minHeight屬性決定的,默認的android:minHeight為
<item name="android:minHeight">?attr/actionBarSize</item>
actionBarSize定義為
<item name="actionBarSize">@dimen/abc_action_bar_default_height_material</item>
@dimen/abc_action_bar_default_height_material這個值在不同的value中定義不同
<dimen name="abc_action_bar_default_height_material">56dp</dimen>
values-land.xml
<dimen name="abc_action_bar_default_height_material">48dp</dimen>
...
問題在于當我在toolbar中設置了minHeight的屬性后,發(fā)現(xiàn)并沒有生效,無論是設置style還是直接設置屬性都無效。
經(jīng)過研究發(fā)現(xiàn),當我們在activity中把toolbar設為actionbar的時候調用了
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
此時的toolbar被設置為了actionbar,同時也就應該默認應用了actionbar的style,于是實驗,寫了一個toolbar的style繼承actionbar的style
<style name="ToolbarStyle" parent="Base.Widget.AppCompat.ActionBar">
<item name="android:minHeight">@dimen/toolbar_minHeight</item>
</style>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
style="@style/ToolbarStyle"
/>
至此,toolbar的高度已經(jīng)可以控制。同時本人有點強迫癥,覺得好好的toolbar為啥要變成actionbar并繼承actionbar的style才行,于是我把代碼中的設置toolbar為actionbar那句注釋了,并把toolbar的style改為繼承默認的toolbar style,結果表明是有效的。
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
// setSupportActionBar(toolbar);
<style name="ToolbarStyle" parent="Base.Widget.AppCompat.Toolbar">
<item name="android:textAppearance">@style/ToolbarText</item>
<item name="android:minHeight">@dimen/toolbar_minHeight</item>
</style>
到目前為止,基本搞清了Toolbar的默認高度設置問題。
但是新的問題又出現(xiàn)了,當我把toolbar的layout_Height設為wrap_content,且minHeight的值比較小的時候,發(fā)現(xiàn)toolbar的title與頂部有空隙,向下偏移了一個位置,然后我在toolbar中設置了各種padding=0,margin=0,android:titleMargin=0,但依然無效,最后都以為是字體的偏移引起的。
后來在查看toolbar的默認style時,發(fā)現(xiàn)了Toolbar設置的titleMargin并沒有帶android
<style name="Base.Widget.AppCompat.Toolbar" parent="android:Widget">
<item name="titleTextAppearance">@style/TextAppearance.Widget.AppCompat.Toolbar.Title</item>
<item name="subtitleTextAppearance">@style/TextAppearance.Widget.AppCompat.Toolbar.Subtitle</item>
<item name="android:minHeight">?attr/actionBarSize</item>
<item name="titleMargin">4dp</item>
<item name="maxButtonHeight">@dimen/abc_action_bar_default_height_material</item>
<item name="buttonGravity">top</item>
<item name="collapseIcon">?attr/homeAsUpIndicator</item>
<item name="collapseContentDescription">@string/abc_toolbar_collapse_description</item>
<item name="contentInsetStart">16dp</item>
<item name="contentInsetStartWithNavigation">@dimen/abc_action_bar_content_inset_with_nav</item>
<item name="android:paddingLeft">@dimen/abc_action_bar_default_padding_start_material</item>
<item name="android:paddingRight">@dimen/abc_action_bar_default_padding_end_material</item>
</style>
<style name="ToolbarStyle" parent="Base.Widget.AppCompat.Toolbar">
<item name="titleTextAppearance">@style/ToolbarText</item>
<item name="android:minHeight">@dimen/toolbar_minHeight</item>
<item name="titleMargin">0dp</item>
</style>
然后嘗試設置titleMargin=0,結果顯示正常了。這個問題也算花費了我較多的時間,目前為止,已經(jīng)完美解決。本人只嘗試了toolbar的style,相信actionbar的style也是類似。
總結:還是看看默認的style設置的屬性能給我們更多的啟發(fā)。toolbar的其他屬性也能通過類似的方式進行挖掘。