首先先把程序自带的ActionBar去掉
修改values/styles.xml中的内容:
其他地方先不要改,在style标签中添加两句
<item name="windowNoTitle">true</item> <item name="windowActionBar">false</item>然后运行能看到结果
但是发现通知栏是蓝色的,很不美观,这蓝色实际上是当前的一个主题颜色
在style标签下再增加一条
<item name="android:windowTranslucentStatus"> true </item>
然后再运行,能看到结果
到这我们就把自带的顶部栏给弄没啦
新建并调用自己的ToolBar布局文件
1. 新建布局文件my_toolbar.xml,添加如下内容
my_toolbar.xml
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/my_toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?attr/actionBarSize" android:textSize="45sp" android:fitsSystemWindows="true" android:popupTheme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" android:background="@drawable/my_gradient_1"> </android.support.v7.widget.Toolbar>
保存。
其中android:background="@drawable/my_gradient_1"为我自己新建的一个资源文件,这个资源文件描述的就是一个渐变色
具体内容见下(放在drawable文件夹下)
my_gradient_1.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <gradient android:angle="45" android:startColor="#E0C3FC" android:endColor="#8EC5FC" android:type="linear" /> </shape>
2. 将自定义的my_toolbar布局添加进主布局
在activity_main.xml的最外层布局内,添加
<include layout="@layout/my_toolbar"/>
3. 转到MainActivity.java
(1)首先声明Toolbar类型的变量toolbar(需要导入包 import android.support.v7.widget.Toolbar)
(2)找到其对应的View
toolbar=findViewById(R.id.my_toolbar);
(3)设置标题
toolbar.setTitle("Hello");
(4)加载toolbar
setSupportActionBar(toolbar);
运行就能看见结果啦
其他
Toolbar中自带一个textview和imageview等(我暂时就用到这两个。。。)
可调用方法设置这两部分的内容
1. TextView
toolbar.setTitle("添加自己的标题,如我真帅");
2. ImageView
toolbar.setLogo(这里可以写资源的id或Drawable类型的资源,如R.drawable.my_icon_1);
其中R.drawable.my_icon_1是我自己建立的一个图标文件(AndroidStudio中可以将SVG的图片或图标转成xml文件,放在drawable文件夹下
具体内容见下
my_icon_1.xml
<?xml version="1.0" encoding="utf-8"?> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24.0" android:viewportHeight="24.0"> <path android:fillColor="#FF000000" android:pathData="M4,10.5c-0.83,0 -1.5,0.67 -1.5,1.5s0.67,1.5 1.5,1.5 1.5,-0.67 1.5,-1.5 -0.67,-1.5 -1.5,-1.5zM4,4.5c-0.83,0 -1.5,0.67 -1.5,1.5S3.17,7.5 4,7.5 5.5,6.83 5.5,6 4.83,4.5 4,4.5zM4,16.5c-0.83,0 -1.5,0.68 -1.5,1.5s0.68,1.5 1.5,1.5 1.5,-0.68 1.5,-1.5 -0.67,-1.5 -1.5,-1.5zM7,19h14v-2L7,17v2zM7,13h14v-2L7,11v2zM7,5v2h14L21,5L7,5z"/> </vector>
最终的运行结果见下
发现图标是黑色的,而且文字离图标太近了,我们可以把“我真帅”改成“ 我真帅”(前面有三个空格。。。感觉有点治标不治本的感觉。。。)
对图标来说,能在xml文件中修改颜色,也能在代码中修改。这一部分内容见下。
获取toolbar中TextView和ImageView的id号
虽然能用setTitle和setLogo的方式更改标题和图标,但是感觉能做的东西相对来说少了很多
1. 获取TextView
这里参考了https://blog.csdn.net/noiary/article/details/47449411
这个方法只能使用在已经设置过一次title后即使用过一次toolbar.setTitle()或类似的行为后,而且对于简单的获取来说有一些多余的地方。那就在调用之前先设置一下默认或初始的Logo和Title后再使用此方法。
public static TextView getToolbarTextView(Toolbar toolbar){ for(int i= 0; i < toolbar.getChildCount(); i++){ View v = toolbar.getChildAt(i); if(v != null && v instanceof TextView){ return (TextView)v; } } return null; }
2. 获取ImageView
和上面的类似,就是把TextView改成了ImageView
public static ImageView getToolbarImageView(Toolbar toolbar){ for(int i= 0; i < toolbar.getChildCount(); i++){ View v = toolbar.getChildAt(i); if(v != null && v instanceof ImageView){ return (ImageView)v; } } return null; }
当然可以把上述两个方法结合一下,用一次循环给两个全局变量imageview和textview赋值。
到这里的代码都在链接里:https://pan.baidu.com/s/18GDxI2mQ-BlqBnyBx1-R6w 失效了告诉我哦。。。
本人水平有限,不对之处还望大家指出哈