Android(安卓)Toolbar
android toolbar
简单的说,就是替代了 actionbar 的另外一个产物。
AppCompatActivity
是替代了 actionbarActivity的另外一个产物。
一,替换 actionbar
1.布局文件
.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?actionBarSize" android:background="?attr/colorPrimary"// 设置菜单弹出框的样式 // app:popupTheme="@style/ThemeOverlay.AppCompat.Light"// 设置toolbar的样式// app:theme="@style/ToolBarStyle"> "@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:ellipsize="end" android:layout_gravity="center" android:gravity="center" android:textColor="@color/white" android:textSize="18dp"/> .support.v7.widget.Toolbar>
(1)android:minHeight=”?attr/actionBarSize”:设置标题栏最小高度为ActionBar的高度。
(2)android:background=”?attr/colorPrimary”:该主题下的主色。也就是默认的灰色。
android:theme
Android 5.0 可以给一个 View 单独设置一个 theme 了,其主要用途就是用在 ToolBar 上, 比如 当前使用白色主题但是想使用黑色的 ToolBar ,只要在 ToolBar 的 xml 文件 中添加 android:theme=”@android:style/ThemeOverlay.Material.Dark.ActionBar”
<Toolbar android:layout_height="?android:attr/actionBarSize" android:layout_width="match_parent" android:theme="@android:style/ThemeOverlay.Material.Dark.ActionBar" />
该功能在 5.0 之前也存在,只是无法单独在 View 上设置而已,比如 5.0之前的 Theme.Holo.Light.DarkActionBar 主题,就是白色主题但是 ActionBar 是黑色。这种底层实现方式是通过一个 actionBarWidgetTheme 来引入一个新的主题
<style name="Theme.Holo.Light.DarkActionBar"> <item name="android:actionBarWidgetTheme">@android:style/Theme.Holostyle>
android:theme 是 5.0 中新添加到 View 上的属性。需要注意的是, 该属性会传递给所有子控件,例如:
<LinearLayout android:theme="@android:style/ThemeOverlay.Material.Dark"> LinearLayout>
android:theme这个属性,在android3.0以上可以应用到View及其子View的,但是在android3.0以下只能应用到当前的View,是不能使子View起作用的,所有要用到该theme的View都要加上
图片来源网络,阐述了各自属性的位置
2. 主题文件
//toolbar的样式设置
可以在 v21中设置导航栏背景
<style name="AppTheme" parent="AppTheme.Base"> <item name="android:navigationBarColor">#66cc99item> style>
3.menu_main.xml
always:总是显示在界面上
never:不显示在界面上,只让出现在右边的三个点中
ifRoom:如果有位置才显示,不然就出现在右边的三个点中
withText: 可以在导航栏中设置标题,这个标题就是通过 android:title 定义的
代码中
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (ViewUtils.isFastClick()) return true; switch (item.getItemId()) { //左上角的 默认 home id按钮 case android.R.id.home: break; //其他 menu 中的 id按钮事件 case R.id.xx: break; default: break; } return super.onOptionsItemSelected(item); }
PS:实际中,还是点击按钮 弹出自定义的pop 更方便,并且更加适合改动,actionbar 弹出的这个window能设置的属性比较有限,效果也很一般。
5. 代码中设置 toolbar
@Bind(R.id.toolbar) Toolbar mToolBar;//setHomeButtonEnabled这个小于4.0版本的默认值为true的。但是在4.0及其以上是false,该方法的作用:决定左上角的图标是否可以点击。没有向左的小图标。 true 图标可以点击 false 不可以点击。// 给左上角图标的左边加上一个返回的图标 。对应ActionBar.DISPLAY_HOME_AS_UP//actionBar.setDisplayHomeAsUpEnabled(true)//使左上角图标是否显示,如果设成false,则没有程序图标,仅仅就个标题,否则,显示应用程序图标,对应id为android.R.id.home,// 对应ActionBar.DISPLAY_SHOW_HOME// actionBar.setDisplayShowHomeEnabled(true)// 使自定义的普通View能在title栏显示,即actionBar.setCustomView能起作用,对应ActionBar.DISPLAY_SHOW_CUSTOM//actionBar.setDisplayShowCustomEnabled(true)//对应ActionBar.DISPLAY_SHOW_TITLE。//actionBar.setDisplayShowTitleEnabled(true)//其中setHomeButtonEnabled和setDisplayShowHomeEnabled共同起作用,如果setHomeButtonEnabled设成false,//即使setDisplayShowHomeEnabled设成true,图标也不能点击 private void initToolBar(boolean hideBackButton) { if (mToolBar == null) { return; } // 设置 titlebar 替代 actionbar setSupportActionBar(mToolBar); // 获取设置后的对象 android.support.v7.app.ActionBar ab= getSupportActionBar(); if (ab!= null) { // 设置左上角的自定义图标 ab.setHomeAsUpIndicator(R.mipmap.menu); // 设置显示 ab.setDisplayHomeAsUpEnabled(true); }}
问题:
在布局XML中设置Android:navigationIcon=”@drawable/icon”或者在代码中设置都无法自定义成自己需要设置的NavigationIcon图片。
解决办法:
放弃在xml中设置,并且必须在ToolBar初始化之后,setSupportActionBar(toolbar)方法之后,setNavigationIcon()以及各种自定义ToolBar设置(例如:toolbar.setTitle(“Title”);)之前,否者同样无法将设置应用到ToolBar之上。
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);setSupportActionBar(toolbar);toolbar.setNavigationIcon(R.drawable.icon);toolbar.setTitle("My Title");toolbar.setSubtitle("Sub title");toolbar.setLogo(R.drawable.ic_launcher);
这个图来自于网络,很直观,toolbar的各属性
二,单独使用 toolbar
xml 还用之前的就好了。
1. 类中的代码
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); android.support.v7.app.ActionBar ab= getSupportActionBar(); if (actionBar != null) { ab.setDisplayHomeAsUpEnabled(true); //隐藏actionbar的 title ab.setDisplayShowTitleEnabled(false); }// Logotoolbar.setLogo(R.drawable.ic_launcher);// 一级标题toolbar.setTitle("My Title");// 二级标题toolbar.setSubtitle("Sub title");// 单独设置 toolbar的menu菜单toolbar.inflateMenu(R.menu.activity_main);// Navigation Icon 要設定在 setSupoortActionBar后 才有作用// 否則會出現 back button toolbar.setNavigationIcon(R.drawable.ab_android);//设置点击事件toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } });// Menu item click 设定在 setSupportActionBar 之后才有作用toolbar.setOnMenuItemClickListener(onMenuItemClick);//脱离actionbar 的 toolbar 自定义点击事件处理private Toolbar.OnMenuItemClickListener onMenuItemClick = new Toolbar.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem menuItem) { switch (menuItem.getItemId()) { case R.id.xxx: break; } return true; }};
更多相关文章
- Android自动横屏注意事项
- 解决CardView无点击效果 实现水波纹效果
- Android(安卓)ScrollView 判断到顶到底,和设置到顶到底
- android之View属性
- android点击邮箱链接跳转发送
- android里发送mail的几种方式
- AndroidVirtual Devices (AVD)创建、设置
- Android(安卓)设置EditText光标Curso颜色及粗细
- ReactNative 调用Android(安卓)原生(二)——原生组件