修改ActionBar上各个元素的间距问题

来源:互联网 发布:武汉矩阵互动怎么样 编辑:程序博客网 时间:2024/06/05 09:06

终于弄清楚了ActionBar上的各种间距值怎么调整,分享一下。

先简单介绍一下ActionBar的构成,如下图所示,(懒得自己画了,借用网上找的一张)


下边是一个简单的ActionBar的应用,借用这个图介绍一下各个值如何调整


ActionBar的大部分值都是定义在theme.xml和style.xml中的,也有部分是直接写在layout中。并且很多时候导航栏是通过ToolBar实现的,所以ToolBar的一些值也有可能会用到。在原生代码中,ActionBar和ToolBar的Style如下,基本上大部分的值都是在自己的应用的style.xml中重写这些原生定义的值,达到我们自己想要的效果。我以下的配置全部参考的Material的theme,其他theme的某些值可能会跟这个有些出入。

<style name="Widget.Material.ActionBar">        <item name="background">@null</item>        <item name="backgroundStacked">@null</item>        <item name="backgroundSplit">@null</item>        <item name="displayOptions">showTitle</item>        <item name="divider">?attr/dividerVertical</item>        <item name="height">?attr/actionBarSize</item>        <item name="paddingStart">0dip</item>        <item name="paddingTop">0dip</item>        <item name="paddingEnd">0dip</item>        <item name="paddingBottom">0dip</item>        <item name="titleTextStyle">@style/TextAppearance.Material.Widget.ActionBar.Title</item>        <item name="subtitleTextStyle">@style/TextAppearance.Material.Widget.ActionBar.Subtitle</item>        <item name="progressBarStyle">?attr/progressBarStyleHorizontal</item>        <item name="indeterminateProgressStyle">?attr/progressBarStyle</item>        <item name="progressBarPadding">32dp</item>        <item name="itemPadding">8dp</item>        <item name="homeLayout">@layout/action_bar_home_material</item>        <item name="gravity">center_vertical</item>        <item name="contentInsetStart">@dimen/action_bar_content_inset_material</item>        <item name="contentInsetStartWithNavigation">@dimen/action_bar_content_inset_with_nav</item>        <item name="contentInsetEnd">@dimen/action_bar_content_inset_material</item>        <item name="elevation">@dimen/action_bar_elevation_material</item>        <item name="popupTheme">?attr/actionBarPopupTheme</item>    </style>

<style name="Widget.Toolbar">        <item name="titleTextAppearance">@style/TextAppearance.Widget.Toolbar.Title</item>        <item name="subtitleTextAppearance">@style/TextAppearance.Widget.Toolbar.Subtitle</item>        <item name="minHeight">?attr/actionBarSize</item>        <item name="titleMargin">4dp</item>        <item name="maxButtonHeight">@dimen/action_bar_default_height_material</item>        <item name="buttonGravity">top</item>        <item name="navigationButtonStyle">@style/Widget.Toolbar.Button.Navigation</item>        <item name="collapseIcon">?attr/homeAsUpIndicator</item>        <item name="collapseContentDescription">@string/toolbar_collapse_description</item>        <item name="contentInsetStart">16dp</item>        <item name="contentInsetStartWithNavigation">@dimen/action_bar_content_inset_with_nav</item>        <item name="touchscreenBlocksFocus">true</item>        <item name="keyboardNavigationCluster">true</item>    </style>


1,左侧只有标题文字时

使用方法:在AndroidMenifest.xml中,直接设置lable即可

<activity            android:name=".ActionBarTest"            android:label="@string/title_actionbartest" >        </activity>
距左侧边距的调整方法:

重写ActionBar的<item name="contentInsetStart">@dimen/action_bar_content_inset_material</item>这个值,原生ActionBar的contentInsetStart和contentInsetEnd均为16dp


2,返回箭头

使用方法:

final ActionBar bar = getActionBar();        bar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_HOME_AS_UP);

很多人遇到的的一个问题是返回箭头与标题文字之间的距离太大,这个间距有两个值会影响到

一个是ActionBar的<item name="contentInsetStartWithNavigation">@dimen/action_bar_content_inset_with_nav</item>,这个值的意思是当导航栏上有navigation button的时候的start padding,原生默认值是72dp,所以距离会很大。

另一个是Toolbar的<item name="titleMargin">4dp</item>,这个值表示你的标题的上下左右的margin,原生是4dp,如果你只想调整某一个方向的margin比如距左的,你也可以直接重写<item name="titleMarginStart">0dp</item>,其他同理。


3,Action Menu

使用方法:

menu下actions.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">    <item android:id="@+id/action_edit"        android:icon="@drawable/ic_adit_nor_black"        android:showAsAction="ifRoom"        android:title="@string/action_bar_edit" />    <item android:id="@+id/action_edit"        android:icon="@drawable/ic_adit_nor_black"        android:showAsAction="ifRoom"        android:title="@string/action_bar_edit" />    <item android:id="@+id/action_search"          android:icon="@drawable/ic_search_nor_black"          android:title="@string/action_bar_search"          android:showAsAction="ifRoom"          android:actionViewClass="android.widget.SearchView" /></menu>
Activity中
@Override    public boolean onCreateOptionsMenu(Menu menu) {        MenuInflater inflater = getMenuInflater();        inflater.inflate(R.menu.actions, menu);        return true;    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        Toast.makeText(this, "Selected Item: " + item.getItemId(), Toast.LENGTH_SHORT).show();        return true;    }

ActionMenu这部分,值的定义也比较分散,原生代码中关于这部分的设置除去在actionBar中定义的,还涉及到ActionButton的设置,如下:

<style name="Widget.Material.ActionButton">        <item name="background">?attr/actionBarItemBackground</item>        <item name="paddingStart">12dp</item>        <item name="paddingEnd">12dp</item>        <item name="minWidth">@dimen/action_button_min_width_material</item>        <item name="minHeight">@dimen/action_button_min_height_material</item>        <item name="gravity">center</item>        <item name="scaleType">center</item>        <item name="maxLines">2</item>    </style>    <style name="Widget.Material.ActionButton.Overflow">        <item name="src">@drawable/ic_menu_moreoverflow_material</item>        <item name="background">?attr/actionBarItemBackground</item>        <item name="contentDescription">@string/action_menu_overflow_description</item>        <item name="tooltipText">@string/action_menu_overflow_description</item>        <item name="minWidth">@dimen/action_button_min_width_overflow_material</item>        <item name="minHeight">@dimen/action_button_min_height_material</item>        <item name="paddingStart">@dimen/action_bar_overflow_padding_start_material</item>        <item name="paddingEnd">@dimen/action_bar_overflow_padding_end_material</item>    </style>


在一开始的图片中展示的那样,右侧三个图标按钮,前边两个属于item的范畴,后边三个点的按钮则是ActionButton的一种,为overflow,对于前边的item,原生中有固定的layout,并且已经设置好了paddingStart的paddingEnd均为8dp,这样的话再在style中设置padding也不能生效(或者是我还没有找对地方?),但是可以设置overflow的padding,原生的PaddingStart是6dp,paddingEnd是10dp。

当然ActionBar上还有很多元素,如TabBar,Spinner等,这些就不再一一介绍啦


原创粉丝点击