别裁伪体亲风雅,转益多师是汝师。这篇文章主要讲述Android开发:Toolbar基本使用和自定义Toolbar相关的知识,希望能为你提供帮助。
Toolbar简介Toolbar 是 android 5.0 推出的一个 Material Design 风格的导航控件 ,用来取代之前的 Actionbar 。与 Actionbar 相比,Toolbar 明显要灵活的多。它不像 Actionbar 一样,一定要固定在Activity的顶部,而是可以放到界面的任意位置,看下官方文档介绍:
文章图片
注意看着几部分:
- 1.设置导航栏图标;
- 2.设置App的logo;
- 3.支持设置标题和子标题;
- 4.支持添加一个或多个的自定义控件;
- 5.支持Action Menu;
一.Toolbar基本使用 1.Toolbar基本使用效果图
文章图片
这个效果图分别对应上面的那五部分:
1.左侧返回箭头按钮是导航栏图标;
2.小绿人是logo;
3.Title是标题,Subtitle是子标题;
4.自定义控件,是一个TextView
5.Menu
2.使用
首先,在布局文件 activity_normal_toolbar.xml.xml 中添加进 Toolbar 控件
<
?xml version="1.0" encoding="utf-8"?>
<
RelativeLayout
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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.study.toolbardemo.NormalToolbarActivity">
<
android.support.v7.widget.Toolbar
android:id="@+id/toolbar_normal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="Title"
app:titleTextColor="#ffffff"
android:background="@color/colorPrimaryDark"
app:subtitle="SubTitle"
app:subtitleTextColor="#ffffff"
app:logo="@mipmap/ic_launcher"
app:navigationIcon="@mipmap/icon_back_32px">
<
TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ff0000"
android:text="text"/>
<
/android.support.v7.widget.Toolbar>
<
/RelativeLayout>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
<
?xml version="1.0" encoding="utf-8"?>
<
menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<
item
android:id="@+id/action_search"
android:icon="@mipmap/ic_serach"
android:title="@string/menu_search"
app:showAsAction="ifRoom" />
<
item
android:id="@+id/action_notification"
android:icon="@mipmap/notification"
android:title="@string/menu_notification"
app:showAsAction="ifRoom" />
<
item
android:id="@+id/action_item_one"
android:title="@string/item_one"
app:showAsAction="never" />
<
item
android:id="@+id/action_item_two"
android:title="@string/item_two"
app:showAsAction="never" />
<
/menu>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
public class NormalToolbarActivity extends AppCompatActivity {
private Toolbar mNormalToolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_normal_toolbar);
mNormalToolbar= (Toolbar) findViewById(R.id.toolbar_normal);
initToolbar();
}private void initToolbar() {
//设置menu
mNormalToolbar.inflateMenu(R.menu.menu_normal);
//设置menu的点击事件
mNormalToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {int menuItemId = item.getItemId();
if (menuItemId == R.id.action_search) {
Toast.makeText(NormalToolbarActivity.this , R.string.menu_search , Toast.LENGTH_SHORT).show();
} else if (menuItemId == R.id.action_notification) {
Toast.makeText(NormalToolbarActivity.this , R.string.menu_notification , Toast.LENGTH_SHORT).show();
} else if (menuItemId == R.id.action_item_one) {
Toast.makeText(NormalToolbarActivity.this , R.string.item_one , Toast.LENGTH_SHORT).show();
} else if (menuItemId == R.id.action_item_two) {
Toast.makeText(NormalToolbarActivity.this , R.string.item_two , Toast.LENGTH_SHORT).show();
}
return true;
}
});
//设置左侧NavigationIcon点击事件
mNormalToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(NormalToolbarActivity.this, "点击了左侧按钮", Toast.LENGTH_SHORT).show();
}
});
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 在xml中设置时要注意,命名空间不能是android开头,可以是app也可以是其他的
app:title="Title"
app:titleTextColor="#ffffff"
app:subtitle="SubTitle"
app:subtitleTextColor="#ffffff"
app:logo="@mipmap/ic_launcher"
app:navigationIcon="@mipmap/icon_back_32px"
- 1
- 2
- 3
- 4
- 5
- 6
- 要设置主题,隐藏原来自带的,我是直接在style中设置了
<
!-- Base application theme. -->
<
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>
<
/style>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
supportRequestWindowFeature(Window.FEATURE_NO_TITLE) 如果是继承Activity就应该调用requestWindowFeature(Window.FEATURE_NO_TITLE));
二.自定义Toolbar 1.自定义Toolbar效果图
文章图片
2.实现
这里我只是简单的自定义了一下,起到一个抛砖引玉的作用吧。
贴出代码,有注释很详细的,基本上就是把Toolbar当成一个容器,往里面填充个布局
/**
* Created by HFS on 2017/5/10.
*/public class SimpleToolbar extends Toolbar {/**
* 左侧Title
*/
private TextView mTxtLeftTitle;
/**
* 中间Title
*/
private TextView mTxtMiddleTitle;
/**
* 右侧Title
*/
private TextView mTxtRightTitle;
public SimpleToolbar(Context context) {
this(context,null);
}public SimpleToolbar(Context context, AttributeSet attrs) {
this(context, attrs,0);
}public SimpleToolbar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}@Override
protected void onFinishInflate() {
super.onFinishInflate();
mTxtLeftTitle = (TextView) findViewById(R.id.txt_left_title);
mTxtMiddleTitle = (TextView) findViewById(R.id.txt_main_title);
mTxtRightTitle = (TextView) findViewById(R.id.txt_right_title);
}//设置中间title的内容
public void setMainTitle(String text) {
this.setTitle(" ");
mTxtMiddleTitle.setVisibility(View.VISIBLE);
mTxtMiddleTitle.setText(text);
}//设置中间title的内容文字的颜色
public void setMainTitleColor(int color) {
mTxtMiddleTitle.setTextColor(color);
}//设置title左边文字
public void setLeftTitleText(String text) {
mTxtLeftTitle.setVisibility(View.VISIBLE);
mTxtLeftTitle.setText(text);
}//设置title左边文字颜色
public void setLeftTitleColor(int color) {
mTxtLeftTitle.setTextColor(color);
}//设置title左边图标
public void setLeftTitleDrawable(int res) {
Drawable dwLeft = ContextCompat.getDrawable(getContext(), res);
dwLeft.setBounds(0, 0, dwLeft.getMinimumWidth(), dwLeft.getMinimumHeight());
mTxtLeftTitle.setCompoundDrawables(dwLeft, null, null, null);
}
//设置title左边点击事件
public void setLeftTitleClickListener(OnClickListener onClickListener){
mTxtLeftTitle.setOnClickListener(onClickListener);
}//设置title右边文字
public void setRightTitleText(String text) {
mTxtRightTitle.setVisibility(View.VISIBLE);
mTxtRightTitle.setText(text);
}//设置title右边文字颜色
public void setRightTitleColor(int color) {
mTxtRightTitle.setTextColor(color);
}//设置title右边图标
public void setRightTitleDrawable(int res) {
Drawable dwRight = ContextCompat.getDrawable(getContext(), res);
dwRight.setBounds(0, 0, dwRight.getMinimumWidth(), dwRight.getMinimumHeight());
mTxtRightTitle.setCompoundDrawables(null, null, dwRight, null);
}//设置title右边点击事件
public void setRightTitleClickListener(OnClickListener onClickListener){
mTxtRightTitle.setOnClickListener(onClickListener);
}}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
<
?xml version="1.0" encoding="utf-8"?>
<
LinearLayout
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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.study.toolbardemo.CustomToolbarActivity">
<
com.study.toolbardemo.widget.SimpleToolbar
android:id="@+id/simple_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
android:background="?attr/colorPrimaryDark"
android:fitsSystemWindows="true"
app:contentInsetLeft="0dp"
app:contentInsetStart="0dp">
<
TextView
android:id="@+id/txt_left_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:drawableLeft="@mipmap/icon_back_32px"
android:gravity="center"
android:singleLine="true"
android:text="返回"
android:textColor="#ffffff"
android:textSize="16sp"
android:visibility="visible"/>
<
TextView
android:id="@+id/txt_main_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:singleLine="true"
android:text="标题"
android:textColor="@android:color/white"
android:textSize="20sp"
android:visibility="visible"/>
<
TextView
android:id="@+id/txt_right_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_marginRight="10dp"
android:drawableRight="@mipmap/icon_plus"
android:gravity="center"
android:textColor="#ffffff"
android:textSize="16sp"
android:visibility="visible"/>
<
/com.study.toolbardemo.widget.SimpleToolbar>
<
/LinearLayout>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
这里面有几个地方注意下:贴出来style
1.往Toolbar里面填充View的时候,外面最好不要有其他的ViewGroup,如LinearLayout,因为如果外面再包一层的话,Title就不会居中了,那样不太符合我们的设计;
2.app:contentInsetLeft=”0dp” app:contentInsetStart=”0dp”这两个是设置Toolbar左右间隔的,如果不设置的话,默认有个默认值
<
!-- Base application theme. -->
<
style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<
!-- Customize your theme here. -->
<
item name="colorPrimary">
@color/colorPrimary<
/item>
<
item name="colorPrimaryDark">
@color/colorPrimaryDark<
/item>
<
item name="colorAccent">
@color/colorAccent<
/item>
<
item name="windowActionBar">
false<
/item>
<
item name="windowNoTitle">
true<
/item>
<
/style>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-
推荐阅读
- (转) Java RandomAccessFile与MappedByteBuffer
- Android开发:验证码倒计时功能实现
- nltp APP-分析买家评论的评分-高频词(二维关系)
- Android 项目开发填坑记 - 获取系统语言(兼容7.0)
- Android6.0运行时权限管理
- Android 自定义控件之继承ViewGroup创建新容器
- Application.idle方法
- android的控件
- Android binder学习一(主要概念)