Toolbar的适配方案
来源:互联网 发布:bestie软件下载 编辑:程序博客网 时间:2024/05/17 06:12
Toolbar的出现取代了让人诟病已久的Actionbar,本文分两个部分, 一是介绍Toolbar的简单使用和注意事项;二是列举出Toolbar常见的适配方案。
Toolbar的简单使用
Toolbar中包含NavigationIcon,Title,SubTitle,Logo,Menu这几个部分。对应的还有相关的事件监听器。使用并不是特别复杂,下面直接给出代码:
- MainActivity
package com.pan.toolbarsample;import android.content.Intent;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.Toast;/** * Toolbar的简单使用以及封装 */public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initToolbar(); } public void onNextClicked(View view) { Intent intent = new Intent(this, NextActivity.class); startActivity(intent); } private void initToolbar() { Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); // 设置支持toolbar setSupportActionBar(toolbar); // 设置标题,注意:标题受label影响 toolbar.setTitle(R.string.app_name); // 设置标题颜色 toolbar.setTitleTextColor(getResources().getColor(R.color.colorAccent)); // 设置子标题 toolbar.setSubtitle(R.string.sub_title); // 设置子标题颜色 toolbar.setSubtitleTextColor(getResources().getColor(android.R.color.white)); // 设置logo toolbar.setLogo(R.mipmap.ic_launcher); // 设置导航图标,例如:侧滑图标 toolbar.setNavigationIcon(R.mipmap.ic_menu_white_36pt_2x); // 设置菜单点击事件 toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { String msg = ""; switch (item.getItemId()) { case R.id.action_edit: msg += "click edit"; break; case R.id.action_share: msg += "click share"; break; case R.id.action_settings: msg += "click more"; break; default: break; } if (!msg.equals("")) { Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show(); } return true; } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu, menu); return true; }}
- activity_main
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.pan.toolbarsample.MainActivity"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@color/colorPrimary" /> <Button android:layout_width="wrap_content" android:onClick="onNextClicked" android:layout_height="wrap_content" android:text="@string/next" /></LinearLayout>
效果图
注意事项:
setSupportActionBar(toolbar);
此设置最好在一开始设置,因为有些设置需要此设置之后,才有效果,例如:setNavigationIcon()会无效,onCreateOptionsMenu 方法也不会回调。- 使用material主题的时候,必须设定targetSdkVersion = 21,否则界面看起来是模糊的
- navigationBarColor 也就是界面底部导航栏的背景颜色,国内很多手机都把导航栏做成了虚拟键。导航栏的背景色只能用在 API Level 21 (Android 5) 以上的版本进行设置
- Toolbar中默认的标题,只能在AndroidManifest.xml文件中修改,在application标签中设置
android:label="@string/app_name"
Toolbar的适配
国内的开发环境非常的自由,很多公司都不会根据谷歌给的方案进行开发,这时候就会出现很多风格各异的标题栏,最常见的就是左侧一个返回按钮,中间标题栏,右侧有相应的按钮事件。因为toolbar是系统控件,相应的也继承了一些系统特性,比如说沉浸式状态栏。它会根据不同的系统版本自由选择是否呈现沉浸式状态栏,而免去开发者处理。
- 封装的核心是重写
setContentView()
方法
针对布局进行分类,一种是包含标题栏默认的Toolbar样式,一种是自定义的布局,主要是封装在BaseActivity中,子类中根据情况对toolbar进行设置,直接上代码
package com.pan.toolbarsample;import android.os.Bundle;import android.support.annotation.LayoutRes;import android.support.annotation.Nullable;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import android.view.LayoutInflater;import android.view.Menu;import android.view.View;import android.widget.LinearLayout;import android.widget.TextView;/** * Author: Pan * Date: 2016/7/6 * Description: * 封装Toolbar的BaseActivity */public abstract class BaseActivity extends AppCompatActivity { private LinearLayout containerView; private Toolbar toolbar; private TextView rightTextView; private TextView toolbarTitle; private Toolbar.OnMenuItemClickListener mOnMenuItemClickListener; private static final int INVALID_MENU = -1; private int menuResId = INVALID_MENU; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getContentViewId()); } @Override public void setContentView(@LayoutRes int layoutResID) { super.setContentView(layoutResID); //默认布局 if (containerView == null && layoutResID == R.layout.activity_base) { containerView = (LinearLayout) findViewById(R.id.ll_container_view); toolbar = (Toolbar) findViewById(R.id.toolbar); rightTextView = (TextView) findViewById(R.id.tv_right); toolbarTitle = (TextView) findViewById(R.id.toolbar_title); defaultToolbarSetting(); setToolBar(); } else if (layoutResID != R.layout.activity_base) { //添加新的布局 View view = LayoutInflater.from(this).inflate(layoutResID, null); initView(view); initListener(); } } public abstract void initListener(); public abstract void initView(View view); /** * Toolbar默认设置 */ private void defaultToolbarSetting() { toolbar.setNavigationIcon(R.mipmap.ic_arrow_back_white_48pt_2x); toolbarTitle.setText(R.string.app_name); setSupportActionBar(toolbar); if (getSupportActionBar() != null) { // 隐藏标题 getSupportActionBar().setDisplayShowTitleEnabled(false); } // Navigation的默认点击事件 toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); } public void setToolBar() { } public Toolbar getToolbar() { return toolbar; } public int getContentViewId() { return R.layout.activity_base; } /** * 设置toolbar右侧图片 * * @param resId * 资源Id */ public void setRight(int resId) { rightTextView.setCompoundDrawablesWithIntrinsicBounds(0, 0, resId, 0); } /** * 设置toolbar右侧文字 * * @param rightStr * 字符串 */ public void setRight(String rightStr) { rightTextView.setText(rightStr); } /** * 设置toolbar右侧图片及点击事件 * * @param resId * 图片资源Id * @param clickListener * 事件监听 */ public void setRight(int resId, View.OnClickListener clickListener) { rightTextView.setCompoundDrawablesWithIntrinsicBounds(0, 0, resId, 0); rightTextView.setOnClickListener(clickListener); } /** * 设置menu及条目点击事件的监听 * * @param menuResId * menu资源id * @param menuItemClickListener * 条目事件监听 */ public void setMenu(int menuResId, Toolbar.OnMenuItemClickListener menuItemClickListener) { this.menuResId = menuResId; setOnMenuItemClickListener(menuItemClickListener); } /** * 设置Navigation * * @param resId * 资源Id * @param onClickListener * 点击事件 */ public void setNavigation(int resId, View.OnClickListener onClickListener) { toolbar.setNavigationIcon(resId); toolbar.setNavigationOnClickListener(onClickListener); } /** * 设置监听 * * @param menuItemClickListener * 设置条目监听器 */ private void setOnMenuItemClickListener(Toolbar.OnMenuItemClickListener menuItemClickListener) { this.mOnMenuItemClickListener = menuItemClickListener; toolbar.setOnMenuItemClickListener(mOnMenuItemClickListener); } @Override public boolean onCreateOptionsMenu(Menu menu) { if (menuResId != INVALID_MENU) { getMenuInflater().inflate(menuResId, menu); } return true; }}
- 使用
package com.pan.toolbarsample;import android.view.View;import android.widget.Toast;/** * Author: Pan * Date: 2016/7/6 * Description: */public class NextActivity extends BaseActivity { @Override public void setToolBar() { // 设置标题 setTitle(R.string.app_name); // 设置Toolbar右侧按钮 setRight(R.mipmap.ic_mode_edit_white_36dp, new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(NextActivity.this, "Edit clicked", Toast.LENGTH_SHORT).show(); } }); // 设置菜单 /*setMenu(R.menu.menu, new Toolbar.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { String msg = ""; switch (item.getItemId()) { case R.id.action_edit: msg += "click edit"; break; case R.id.action_share: msg += "click share"; break; case R.id.action_settings: msg += "click more"; break; default: break; } if (!msg.equals("")) { Toast.makeText(NextActivity.this, msg, Toast.LENGTH_SHORT).show(); } return true; } });*/ // 设置navigation setNavigation(R.mipmap.ic_arrow_back_white_48pt_2x, new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(NextActivity.this, "NextActivity", Toast.LENGTH_SHORT).show(); finish(); } }); } @Override public void initListener() { } @Override public void initView(View view) { }}
- 效果图
相关链接
android:toolbar详解
关于BaseActivity的最佳实践
本文的主要参考
Android ToolBar 的简单封装
这种方式根据实际情况可以尝试
案例代码
0 0
- Toolbar的适配方案
- 薄荷Toolbar(ActionBar)的适配方案
- 薄荷Toolbar(ActionBar)的适配方案
- 薄荷Toolbar(ActionBar)的适配方案
- 薄荷TOOLBAR(ACTIONBAR)的适配方案
- 薄荷Toolbar(ActionBar)的适配方案 (翻译)
- ios宽屏的适配方案
- Cocos2d-js的屏幕适配方案
- COCOS2D-JS的屏幕适配方案
- COCOS2D-JS的屏幕适配方案
- CSS的长度单位适配方案
- 一劳永逸的屏幕适配方案
- Swift的适配方案 -- Snapkit
- android 最为简单的适配方案
- Android 最全面的适配方案
- cocos2D的屏幕适配方案1
- 屏幕适配方案
- 屏幕适配方案
- 多线程Java
- @Configuration+@Bean & @Component & @Resource/@autowired/@Inject
- JAVA中int、String的类型转换
- 文本分词中词语词性标注说明
- test1
- Toolbar的适配方案
- unity3d中上下左右键控制移动
- Java-IO之Apache Commons IO(1)
- cesiumjs开发实践 (七)
- 今天参与了组织上的第一次会议~
- 算法与程序设计——由a-z,0-9组成3位的字符密码
- RTMPdump(libRTMP) 源代码分析 8: 发送消息(Message)
- HDOJ 1236 排名
- 计蒜客-程序设计竞赛入门