秦子帅明确目标,每天进步一点点.....

作者 |  丶E

地址 |  https://www.jianshu.com/p/8c15fc4114a7

前言

标题栏是app开发经常用到的东西,几乎每个页面都有,那就一定需要一个通用的标题栏了。

说到标题栏,很多人会想到Toolbar,谷歌爸爸的东西,毋庸置疑;可RadioButton你还在用么,为什么?拓展性差,我曾经也封装改造过Toolbar,标题字体颜色、字体大小、标题居中、更改高度、左侧留白等等等等,成功的用了一段时间、但心里还是有些不舒服(别说新手用、面对多变的需求,还是会显得很无力吧)

请不要喷我、因为我曾经也是一个倔强的坚信谷歌爸爸所有东西的Android开发者;
说了这么多、进入正题吧。

效果及实现

1.最简单的实现和效果


xml

<com.next.easytitlebar.view.EasyTitleBar
       android:id="@+id/titleBar"
       android:layout_width="match_parent"
       android:layout_height="wrap_content">com.next.easytitlebar.view.EasyTitleBar>

Activity

/**
* 历史记录
*/public class HistoryActivity extends BaseActivity {@Overrideprotected int getScreenMode() {return 0;
   }@Overrideprotected int getLayoutId() {return R.layout.activity_history;
   }@Overrideprotected void onViewCreated() {
   }@Overrideprotected void initEventAndData() {
   }
}

效果:

Activity中什么操作都没有就完成了这个实现、点击箭头直接返回、标题显示的是AndroidManifest.xml中的label(当然这些都是封装好的、下面会提到)

<activityandroid:name=".ui.HistoryActivity"android:label="历史记录"android:launchMode="singleTask"android:screenOrientation="portrait" />

2.左右两侧新增menu,可能是图片、文字、也可能是一个稍复杂的View(数量也都不一定),这也是经常见的需求

  • Java代码添加文字、图片及监听事件

titleBar.addRightImg(R.mipmap.icon_contact, new EasyTitleBar.MenuBuilder.OnMenuClickListener() {@Overridepublic void OnMenuEvent() {
               Toast.makeText(getContext(), "没有联系人", Toast.LENGTH_SHORT).show();
           }
       });

也可以这样添加menu、同时设置之间的距离

locationText = (TextView) new EasyTitleBar.MenuBuilder(getContext(), titleBar)
               .text("北京")
               .paddingleft(15)
               .paddingright(15)
               .menuTextColor(ContextCompat.getColor(getContext(),R.color.appColor))
               .onItemClickListener(new EasyTitleBar.MenuBuilder.OnMenuClickListener() {@Overridepublic void OnMenuEvent() {
                       locationText.setText("上海");
                   }
               })
               .createText();
titleBar.addLeftView(locationText);

  • Java代码添加稍复杂view

View view = LayoutInflater.from(getContext()).inflate(R.layout.schedule_menu_view, null);
titleBar.addRightView(view);

  • xml中也可以添加(xml左右两边最多添加三个、应该够了吧,满足不了可以在Java代码中添加)

<attr name="Easy_rightOneImage" format="reference" /><attr name="Easy_rightOneText" format="string" /><attr name="Easy_rightTwoImage" format="reference" /><attr name="Easy_rightTwoText" format="string" /><attr name="Easy_rightThreeImage" format="reference" /><attr name="Easy_rightThreeText" format="string" />

  • 等等、那点击事件呢?

你可以通过getRightLayout(position)直接获取到view、然后设置点击事件

titleBar.getRightLayout(0).setOnClickListener(new View.OnClickListener() {@Override
           public void onClick(View view) {//点击了
           }
       });

这里需要注意的是右侧添加的view是从右向左排列的

3.滑动渐变可使用attachScrollView方法(支持NestedScrollView和RecyclerView),当然你也可以自己监听滑动距离、然后调用titleBar.setBackgroundColor(color)设置背景的颜色;

titleBar.attachScrollView(mSrollView, R.color.white, EasyUtil.dip2px(getContext(), 250) + titleBar.getHeight(), new EasyTitleBar.OnSrollAlphaListener() {@Overridepublic void OnSrollAlphaEvent(float alpha) {if (alpha > 0.8) {
                   titleBar.setTitle("我的");
                   titleBar.setTitleColor(ContextCompat.getColor(getContext(), R.color.common_text_3));
                   EasyStatusBarUtil.StatusBarLightMode(getActivity(), R.color.white, R.color.status_bar_color); //设置白底黑字
                   isBlack = true;
               } else {
                   isBlack = false;
                   EasyStatusBarUtil.StatusBarDarkMode(getActivity(), ((MainActivity) getActivity()).getMode());
                   titleBar.setTitle("");
                   titleBar.setTitleColor(ContextCompat.getColor(getContext(), R.color.white));
               }
           }
       });

4.双击事件处理些滑动到顶部之类的需求

titleBar.setOnDoubleClickListener(new EasyTitleBar.OnDoubleClickListener() {@Overridepublic void onDoubleEvent(View view) {
               mSrollView.post(new Runnable() {@Overridepublic void run() {
                       mSrollView.fling(0);// mSrollView.smoothScrollTo(0, 0);
                       mSrollView.fullScroll(ScrollView.FOCUS_UP);
                   }
               });
           }
       });

配置

1. 依赖

Step 1. Add it in your root build.gradle at the end of repositories:

allprojects {
       repositories {
           ...
           maven { url 'https://jitpack.io' }
       }
   }

Step 2. Add the dependency

implementation 'com.github.forvv231:EasyTitleBar:1.0.0'

2. Application中设置全局默认配置

private void initEasyTitleBar() {EasyTitleBar.init().backIconRes(R.mipmap.icon_l).backgroud(ContextCompat.getColor(instance, R.color.appColor)).titleSize(18).titleColor(ContextCompat.getColor(instance, R.color.white)).titleBarHeight(56);
   }

封装及属性

默认点击返回箭头、关闭界面

在Application的onCreate加入以下代码:

registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {@Overridepublic void onActivityCreated(final Activity activity, Bundle savedInstanceState) {// ActivityBean bean = new ActivityBean();// Unbinder unbinder = ButterKnife.bind(activity);// bean.setUnbinder(unbinder);//  activity.getIntent().putExtra("ActivityBean", bean);//这里全局给Activity设置toolbar和title,你想象力有多丰富,这里就有多强大,以前放到BaseActivity的操作都可以放到这里if (activity.findViewById(R.id.titleBar) != null) { //找到 Toolbar 并且替换 Actionbar
                   EasyTitleBar easyTitleBar = activity.findViewById(R.id.titleBar);
                   easyTitleBar.getBackLayout().setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {
                           activity.onBackPressed();
                       }
                   });
               }
           }@Overridepublic void onActivityStarted(Activity activity) {
           }@Overridepublic void onActivityResumed(Activity activity) {
           }@Overridepublic void onActivityPaused(Activity activity) {
           }@Overridepublic void onActivityStopped(Activity activity) {
           }@Overridepublic void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
           }@Overridepublic void onActivityDestroyed(Activity activity) {// ActivityBean bean = activity.getIntent().getParcelableExtra("ActivityBean");//  bean.getUnbinder().unbind();
           }
       });

注:xml使用时id要和Application中findViewById中的一样,代码中屏蔽的为ButterKnife的部分、你也可以尝试下、就不用每次都在Activity中绑定了

属性:

<declare-styleable name="EasyTitleBar"><attr name="Easy_titleBarHeight" format="dimension" /><attr name="Easy_titleBarBackground" format="color" /><attr name="Easy_fitColor" format="color|reference" /><attr name="Easy_parentPadding" format="dimension" /><attr name="Easy_viewPadding" format="dimension" /><attr name="Easy_title" format="string" /><attr name="Easy_titleSize" format="dimension" /><attr name="Easy_titleColor" format="color" /><attr name="Easy_titleStyle"><flag name="center" value="0" /><flag name="left" value="1" />attr><attr name="Easy_lineState"><flag name="gone" value="0" /><flag name="visiable" value="1" />attr><attr name="Easy_lineHeight" format="dimension" /><attr name="Easy_lineColor" format="color" /><attr name="Easy_backLayoutState"><flag name="visiable" value="1" /><flag name="gone" value="0" />attr><attr name="Easy_backRes" format="reference" /><attr name="Easy_leftOneImage" format="reference" /><attr name="Easy_leftOneText" format="string" /><attr name="Easy_leftTwoImage" format="reference" /><attr name="Easy_leftTwoText" format="string" /><attr name="Easy_leftThreeImage" format="reference" /><attr name="Easy_leftThreeText" format="string" /><attr name="Easy_leftLayoutState"><flag name="gone" value="0" /><flag name="visiable" value="1" />attr><attr name="Easy_rightOneImage" format="reference" /><attr name="Easy_rightOneText" format="string" /><attr name="Easy_rightTwoImage" format="reference" /><attr name="Easy_rightTwoText" format="string" /><attr name="Easy_rightThreeImage" format="reference" /><attr name="Easy_rightThreeText" format="string" /><attr name="Easy_rightLayoutState"><flag name="gone" value="0" /><flag name="visiable" value="1" />attr><attr name="Easy_fitsSystemWindows" format="boolean" /><attr name="Easy_hasStatusPadding" format="boolean" /><attr name="Easy_menuImgSize" format="dimension" /><attr name="Easy_menuTextSize" format="dimension" /><attr name="Easy_menuTextColor" format="color" />declare-styleable>

Github地址:

https://github.com/forvv231/EasyTitleBar.git

---END---

 创作不易,点个“在看

android标题栏添加按钮_几行代码实现Android通用标题栏(轻松向左右两侧添加Menu)...相关推荐

  1. Android安全防护之旅---几行代码让Android应用变得更加安全

    我们在编码美丽微信公众号已经弄过了很多app了,不管是协议还是外挂,我们都是那么一路走过来了,在操作的过程中也发现了很多问题就是应用不在乎安全问题带来的后果,因为安全始终都是不可忽视的问题,辛辛苦苦写 ...

  2. android标题栏添加按钮_如何从iPhone或Android设备访问PC

    如果您不 在家中工作 ,您仍然可以远程访问办公室中的计算机. 可以在计算机之间完成此操作,也可以使用Microsoft的 远程桌面工具 从iOS或Android设备访问远程PC. 有了它,您就可以像坐 ...

  3. 用kotlin方式打开《第一行代码:Android》之开发酷欧天气(1)

    参考:<第一行代码:Android>第2版--郭霖 注1:本文为原创,例子可参考郭前辈著作:<第一行代码:Android>第2版,转载请注明出处! 注2:本文不赘述androi ...

  4. 用kotlin方式打开《第一行代码:Android》之开发酷欧天气(2)

    参考:<第一行代码:Android>第2版--郭霖 注1:本文为原创,例子可参考郭前辈著作:<第一行代码:Android>第2版 注2:本文不赘述android开发的基本理论, ...

  5. android弧形左右滑动空间,ArcSlidingHelper 几行代码实现Android弧形滑动

    几行代码实现Android弧形滑动 使用方式: 添加依赖: implementation 'com.wuyr:arcslidinghelper:1.0.0' APIs: MethodDescripti ...

  6. android标题栏添加按钮_改善Android布局性能

    布局是 Android 应用中直接影响用户体验的关键部分.如果实现不当,您的布局可能会导致应用界面缓慢且需要占用大量内存.Android SDK 包含一些工具,有助于您识别布局性能方面的问题,将这些工 ...

  7. $《第一行代码:Android》读书笔记——第6章 数据持久化

    主要讲述了Android数据持久化的三种方式:文件存储.SharedPreference存储.SQLite数据库存储. (一)文件存储 其实Android中文件存储方式和Java的文件操作类似,就是用 ...

  8. android 打包 混淆配置_玩转代码混淆工具:ProGuard

    维基百科对ProGuard的介绍是:ProGuard是一个压缩(shrink),优化(optimize)与混淆(Obfuscate)Java代码的开源命令行工具.也就是说混淆只是ProGuard的其中 ...

  9. Android安全防护之旅—只需要这几行代码让Android程序项目变得更加安全

    一.混淆永远都不可或缺 这里说的混淆不是说的传统大家都知道的简单混淆策略,而是高级一点的混淆策略,首先是代码混淆,大家可以参考小黄车app的代码: 看到了吧人家把代码混淆成中国人可以看懂的信息,可惜这 ...

最新文章

  1. Struts2入门这一篇就够了
  2. linux ie8找不到,ie浏览器不见了怎么办 三种方法搞定【图文教程】
  3. Oracle 11.2.0.2新特性——用户重命名(Rename User)
  4. SSH原理与运用(一):远程登录
  5. python定义16进制数组_python 文件转成16进制数组的实例
  6. 2018-05-31 第二十五天
  7. 百炼OJ - 1004 - 财务管理
  8. 牛客网NOIP赛前集训营-提高组(第六场)B-选择题[背包]
  9. JDK源码学习路线~每天学一点~每天进步一点点
  10. Docker 精通之 docker-compose
  11. 睡眠音频分割及识别问题(十二)--基于IOS的YAMNet音频识别(总结)
  12. UI登陆页面素材|让设计师在竞争中脱颖而出
  13. 微课|玩转Python轻松过二级(3.2节):元组与生成器推导式
  14. Ajax不起作用....
  15. Scratch编程学习的好处
  16. 注册表编辑已经被您的系统管理员停用
  17. 全民美颜时代中,美颜SDK担任着什么角色?
  18. PTA-- 快速排序(25)
  19. 批处理文件写法(转帖)
  20. redis 在java中的实例使用场景

热门文章

  1. 买买买!!!电商促销必备的气氛PSD分层海报
  2. UI素材模板|新拟态新趋势图标ICON
  3. plc和pc串口通讯接线_PC与PLC的串口通信及编程实现
  4. flexsession禁用_flex(替代session过期)用户长时间不操作要求重新登录的处理
  5. python1234出栈_Python数据结构与算法3——栈和队列
  6. QT创建相应文件夹在指定目录下
  7. Linux内存管理:反向映射机制(匿名页,文件页和ksm页)
  8. Linux内核之XArray
  9. Introduction to the Linux Kernel
  10. 编译原理:利用yacc/bison进行语法分析