Android5.0之Toolbar详解
AdrienneTie
8年前
<p>搜索Toolbar相关文章满天飞,但是大都不是很全面,每次要用到的时候又要重头过滤一遍。而且随着版本升级很多较早的文章的方法已经失效,最近刚好好用到Toolbar,就将相关配置整理下,方便以后使用。</p> <p>环境说明:</p> <ul> <li>Android Studio 2.0</li> <li>V7包版本:com.android.support:appcompat-v7:23.4.0</li> <li>compileSdkVersion 23</li> <li>buildToolsVersion "24.0.0"</li> </ul> <h2>Toolbar 引入使用</h2> <p>XML布局中加入:</p> <pre> <code class="language-java"><android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize"/></code></pre> <p>主题改为隐藏ActionBar:</p> <pre> <code class="language-java">Theme.AppCompat.Light.NoActionBar</code></pre> <p>Activity代码中加入:</p> <pre> <code class="language-java">setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar);</code></pre> <p>此时运行效果:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/a7c1a91c6782802fec8ed8fde523e0fd.png"></p> <p>添加背景色</p> <pre> <code class="language-java">android:background="@color/colorPrimary"</code></pre> <p>此时运行效果:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/600a2a634498c229e49dc207e3efd21f.png"></p> <h2>基本属性设置</h2> <pre> <code class="language-java"><android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@color/colorPrimary" app:navigationIcon="@mipmap/title_bar_back"//左侧图标 app:subtitle="子标题" app:subtitleTextColor="#fff" //标题颜色 app:title="标题" app:titleTextColor="#fff"/> //子标题颜色</code></pre> <p>运行效果:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/34912f4a6ae7f18e8a009bdd326f0af9.png"></p> <p>添加选项菜单</p> <p>第一步创建菜单文件</p> <pre> <code class="language-java"><menu 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" tools:context=".MainActivity"> <item android:id="@+id/action_settings" android:icon="@mipmap/ic_launcher" android:orderInCategory="100" android:title="settings" app:showAsAction="never"/> <item android:id="@+id/action_share" android:icon="@mipmap/ic_action_share" android:orderInCategory="100" android:title="settings" app:showAsAction="ifRoom"/> <item android:id="@+id/action_search" android:icon="@mipmap/ic_action_search" android:orderInCategory="100" android:title="settings" app:showAsAction="ifRoom"/> </menu></code></pre> <p>第二部在代码中重写onCreateOptionsMenu方法加载菜单文件</p> <pre> <code class="language-java">@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; }</code></pre> <p>此时效果:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/d2df727487d76bc21ca9ae71dc0a8de0.png"></p> <h2>个性设置</h2> <h3>左侧返回箭头</h3> <p>想要显示自带的返回箭头,需要去掉之前设定的属性:</p> <pre> <code class="language-java">app:navigationIcon="@mipmap/title_bar_back"</code></pre> <p>然后在代码中添加:</p> <pre> <code class="language-java">getSupportActionBar().setHomeButtonEnabled(true); //设置返回键可用 getSupportActionBar().setDisplayHomeAsUpEnabled(true);</code></pre> <p>此时效果:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/e6971e2ddd222d6ac14340c5972662ca.png"></p> <h3>溢出图标颜色</h3> <p>在style文件中添加:</p> <pre> <code class="language-java"><!-- 溢出菜单图标颜色--> <item name="colorControlNormal">@android:color/white</item></code></pre> <p>此时效果:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/570c5aafc51920e2bba883ddcc2f2cc2.png"></p> <h3>自定义右侧溢出图标</h3> <p>在Style文件中添加:</p> <pre> <code class="language-java"><style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <!-- 溢出菜单图标颜色--> <item name="colorControlNormal">@android:color/white</item> <!-- 溢出菜单图标自定义--> <item name="android:actionOverflowButtonStyle">@style/OverflowButtonStyle</item> </style> <style name="OverflowButtonStyle" parent="android:Widget.ActionButton.Overflow"> <item name="android:src">@mipmap/ic_action_add</item> </style></code></pre> <p>此时运行效果:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/66000d5eb62725f7d3d6a568c6b04855.png"></p> <h3>更改弹出菜单背景</h3> <p>在Style文件中添加样式:</p> <pre> <code class="language-java"><!-- toolbar弹出菜单样式背景 --> <style name="ToolbarPopupTheme" parent="@style/ThemeOverlay.AppCompat"> <item name="android:colorBackground">#FFCC99</item> </style></code></pre> <p>在布局文件中添加使用主题:</p> <pre> <code class="language-java">app:popupTheme="@style/ToolbarPopupTheme"</code></pre> <p>此时运行效果:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/3d33178e7ef09be0755af53a19d6f042.png"></p> <h3>更改弹出菜单文字颜色</h3> <p>添加样式文件:</p> <pre> <code class="language-java"><style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <!-- 溢出菜单图标颜色--> <item name="colorControlNormal">@android:color/white</item> <item name="android:actionOverflowButtonStyle">@style/OverflowButtonStyle</item> <!-- 溢出菜单文字颜色--> <item name="textAppearanceLargePopupMenu">@style/Overflow_Menu_Text_style</item> </style> <!--溢出菜单文字颜色--> <style name="Overflow_Menu_Text_style" parent="@style/TextAppearance.AppCompat.Widget.PopupMenu.Large"> <item name="android:textColor">#fff</item> </style></code></pre> <p>此时运行效果:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/0c40a61c1daf8ede978522c012d9d301.png"></p> <h3>修改标题文字大小</h3> <p>添加配置:</p> <pre> <code class="language-java">app:titleTextAppearance="@style/ToolbarTitleSize"</code></pre> <p>添加style:</p> <pre> <code class="language-java"><!-- toolbar标题文字大小 --> <style name="ToolbarTitleSize" parent="@style/TextAppearance.Widget.AppCompat.Toolbar.Title"> <item name="android:textSize">28sp</item> </style></code></pre> <p>此时运行效果:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/ae6e7a9ec4297fcce3be40e2103d6355.png"></p> <p>子标题文字大小类似,添加配置然后定义style文件(此处省略):</p> <pre> <code class="language-java">app:subtitleTextAppearance="@style/ToolbarTitleSize"</code></pre> <h3>修改弹出菜单位置</h3> <p>修改配置使弹出菜单显示在Toolbar下方:</p> <p>首先重新设置属性:(在界面布局文件Toolbar中)</p> <pre> <code class="language-java">app:popupTheme="@style/OverflowMenuStyle"</code></pre> <p>在Style文件中添加:</p> <pre> <code class="language-java"><style name="OverflowMenuStyle"> <!-- 是否覆盖锚点,默认为true,即盖住Toolbar --> <item name="overlapAnchor">false</item> <item name="android:dropDownWidth">wrap_content</item> <item name="android:paddingRight">5dp</item> <!-- 弹出层背景颜色 --> <item name="android:colorBackground">#FFCC99</item> <!-- 弹出层垂直方向上的偏移,即在竖直方向上距离Toolbar的距离,值为负则会盖住Toolbar --> <item name="android:dropDownVerticalOffset">5dp</item> <!-- 弹出层水平方向上的偏移,即距离屏幕左边的距离,负值会导致右边出现空隙 --> <item name="android:dropDownHorizontalOffset">0dp</item> <!-- 设置弹出菜单文字颜色 --> <item name="android:textColor">#0099CC</item> </style></code></pre> <p>此时运行效果:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/89a4bd4f1c1e05c5896a6ce638c933e8.png"></p> <h3>事件处理</h3> <p>返回按钮事件</p> <p>添加监听</p> <pre> <code class="language-java">toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "点击了返回箭头", Toast.LENGTH_LONG).show(); } });</code></pre> <p>菜单项点击事件</p> <p>重写方法</p> <pre> <code class="language-java">@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_settings: break; case R.id.action_search: break; case R.id.action_share: break; } return true; }</code></pre> <h3>自定义Toolbar</h3> <p>Toolbar下面可以嵌套布局,直接将自己定义好的布局放到Toolbar下面即可</p> <pre> <code class="language-java"><android.support.v7.widget.Toolbar android:layout_width="match_parent" android:layout_height="?attr/actionBarSize"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> ...... </RelativeLayout> </android.support.v7.widget.Toolbar></code></pre> <h3>Toolbar 和 DrawerLayout 左滑菜单</h3> <p>添加左滑布局文件:</p> <pre> <code class="language-java"><?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_left" android:layout_width="match_parent" android:layout_height="match_parent"> <!--侧滑菜单--> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="start" android:background="#CCCCFF" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="选项一" android:textSize="18sp"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:text="选项二" android:textSize="18sp"/> </LinearLayout></code></pre> <p></android.support.v4.widget.DrawerLayout></p> <p>在主布局文件中引入:(在Toolbar下方)</p> <pre> <code class="language-java"><!--DrawerLayout--> <include layout="@layout/custom_drawerlayout"/></code></pre> <p>在代码中添加关联:</p> <pre> <code class="language-java">DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_left); ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.open, R.string.close); mDrawerToggle.syncState(); mDrawerLayout.setDrawerListener(mDrawerToggle);</code></pre> <p>此时运行效果:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/94615d3b1ba7be2a720dacf84633947c.png"></p> <p>新版本studio,在新建Activity的时候可以选择对应的模板,会自动创建好DrawerLayout并关联Toolbar.</p> <p> </p> <p>来自:http://www.jianshu.com/p/e9130d31ee1f</p> <p> </p>