以前大部分项目底部导航栏关于图片部分的实现,要么两套图 selector 切换,要么通过着色器 tint 进行渲染,总之最后呈现的效果便是在点击时两张图静态切换,说 Low 吧,也还凑合,但是总是没那么高大上...-- ... --> 相对比较简单的方式,便是提供一套默认的 Icon,然后根据选中进行 tint 着色,当然,也可以通过 selector 选择器去设置对应选中以及未选中的 Icon,...根据个人喜欢以及项目自行选择。...反正初始的 Drawable 就是灰色,当然也是未选中的状态,随后赶紧实战测试了一波,附上关键代码: override fun onNavigationItemReselected(item: MenuItem...apply { playAnimation() } // 这里判断如果当前点击的和上一次点击索引不同,则将上一次点击索引位置的 MenuItem Icon 替换
设置的接口是一个匿名内部类 BottomNavigationView.OnNavigationItemSelectedListener 对象 , 其中定义了一个 boolean onNavigationItemSelected...调用 setOnNavigationItemSelectedListener 函数 , 设置的监听器是 BottomNavigationView.OnNavigationItemSelectedListener...类型的匿名内部类 ; 最原始的设置方式如下 , 首先创建 BottomNavigationView.OnNavigationItemSelectedListener 类型的 对象表达式 , 也就是匿名内部类..., 然后 调用 setOnNavigationItemSelectedListener 函数将其设置给 BottomNavigationView 作为 选择监听器 ; // 创建匿名内部类...} } // 设置匿名内部类参数 navView.setOnNavigationItemSelectedListener(listener) 在上一步的基础上
如何判断Crash report是否已经符号化 一个crash report有可能未符号化,完全符号化,也有可能部分符号化。未符号化的crash report不会在堆栈信息中包含方法名或者函数名。...atos命令可以被用来单独符号化那些未符号化或者部分符号化过的crash report(中的堆栈信息里的地址)。...第一行列出了当前的线程号,以及当前的执行队列的id。其余各行列出来每一个堆栈中堆栈片段信息,从左到右分别是: · 堆栈片段号。堆栈的展示顺序会和调用顺序一致,片段0是在程序被终止时执行的函数。...片段1是调用片段0的函数,以此类推。 · 在堆栈片段中驻留的执行函数的名称 · 片段0代表机器指令在被终止的生活所在的地址。...其它片段表示如果片段0执行完成之后下一个执行的片段地址 · 在一个符号化的crash report中,代表在堆栈片段中的函数名称 异常 Objective-C中的异常通常用来表明在运行时发生的代码错误,
如何判断Crash report是否已经符号化 一个crash report有可能未符号化,完全符号化,也有可能部分符号化。未符号化的crash report不会在堆栈信息中包含方法名或者函数名。...一种常见原因是在主线程上做网络同步逻辑。不论Thread0上(也就是主线程)想做什么(重要的事),都应该转移到后台线程,或者换一种方式触发,这样它才不会阻塞主线程。...第一行列出了当前的线程号,以及当前的执行队列的id。其余各行列出来每一个堆栈中堆栈片段信息,从左到右分别是: · 堆栈片段号。堆栈的展示顺序会和调用顺序一致,片段0是在程序被终止时执行的函数。...片段1是调用片段0的函数,以此类推。 · 在堆栈片段中驻留的执行函数的名称 · 片段0代表机器指令在被终止的生活所在的地址。...其它片段表示如果片段0执行完成之后下一个执行的片段地址 · 在一个符号化的crash report中,代表在堆栈片段中的函数名称 异常 Objective-C中的异常通常用来表明在运行时发生的代码错误,
如何判断Crash report是否已经符号化 一个crash report有可能未符号化,完全符号化,也有可能部分符号化。未符号化的crash report不会在堆栈信息中包含方法名或者函数名。...atos命令可以被用来单独符号化那些未符号化或者部分符号化过的crash report(中的堆栈信息里的地址)。...第一行列出了当前的线程号,以及当前的执行队列的id。其余各行列出来每一个堆栈中堆栈片段信息,从左到右分别是: 堆栈片段号。堆栈的展示顺序会和调用顺序一致,片段0是在程序被终止时执行的函数。...片段1是调用片段0的函数,以此类推。 在堆栈片段中驻留的执行函数的名称 片段0代表机器指令在被终止的生活所在的地址。...其它片段表示如果片段0执行完成之后下一个执行的片段地址 在一个符号化的crash report中,代表在堆栈片段中的函数名称 异常 Objective-C中的异常通常用来表明在运行时发生的代码错误,例如越界访问数组
Fragment的设计最初也许是为了大屏幕平板设备的需求,不过现在Fragment已经广泛运用到我们普通的手机设备上。下图是我们几乎在主流App中都能发现的一个功能。 ?...但是殊不知,TabHost并非是那么的简单,它的可扩展性非常的差,不能随意地定制Tab项显示的内容,而且运行还要依赖于ActivityGroup。...--关于底层布局我这里使用了Github上的开源项目--> BottomNavigationView...bnv_inactive_text_size="@dimen/bottom_navigation_text_size_inactive"/> 关于底层布局我这里使用了Github上的开源项目...Fragment的最佳实践,我们在许多主流App中都能看到这种顶部、底部导航的效果,并且在此基础上我们探讨了使用Fragment不当的存在性能问题及优化。
Fragment 事务的修改 —— 当您从堆栈弹出一个非常不确定的元素时,这些事务从下层替换出来的时候会撤销之前未添加到返回栈的修改。...而实现这个目的必须要解决大量技术上的问题。...restoreBackStack(): fragmentManager.saveBackStack(“notifications”) fragmentManager.restoreBackStack(“profile”) 这两个堆栈项高效地交换了位置...: △ 交换堆栈项后的 FragmentManager 状态 维持一个单独且活跃的返回栈并且将事务在其中交换,这保证了当返回按钮被点击时,FragmentManager 和系统的其他部分可以保持一致的响应...} // 当重复选择相同项时避免相同目的地的多重拷贝 launchSingleTop = true // 当重复选择之前已经选择的项时恢复状态 restoreState
SVG图片的使用 iconfont:https://www.iconfont.cn/ 我们经常在iconfont上找图片 然后下载下载放在项目里面,为了适配我们还要下载不同尺寸的图片,但是明明iconfont...上的图片就是矢量图,为何我们不用矢量图呢?...我们在下载图片的时候,最后有一项复制SVG 我们复制出来的如下 BottomNavigationView的使用 实现底部菜单常用的方式 RadioGroup + ViewPager + Fragment 加载相邻的Fragment FragmentTabHost...+ Fragment 加载选中的Fragment BottomNavigationView 有选中动画效果 之前我都是用前两种方式来做的 既然官方有现成的 还是推荐用官方的,毕竟有动画效果。
来瓶哇哈哈,精神抖擞来一波~ 简单回顾 Material Design,是谷歌在14年的IO大会上提出的一种新的理念,也被称为新的设计语言(也被称为“原材料设计”),称它为设计语言不为过,但是实际上,这仅仅是谷歌提倡的一种新的设计风格...使用也是很Easy,如下: 创建一个菜单资源 ,最多5个导航目标(BottomNavigationView不支持超过5个项目); 在内容下面放置BottomNavigationView; 将BottomNavigationView...上的app:menu属性设置为菜单资源; 设置选择监听事件setOnNavigationItemSelectedListener(…)。...那下面按照步骤操作一次: Step 1:在布局中添加BottomNavigationView: BottomNavigationView...可视高度由开发人员选择,应足以表明有额外的内容,允许用户触发某个动作或扩展Bottom Sheets; STATE_EXPANDED: Bottom Sheets是可见的并且它的最大高度并且不是拖拽或沉降
以往手动形式埋点 以往的埋点方式都是人为进行定义名称和选择性埋点,版本迭代多次后造成埋点数量持续增加。...,RD进行埋点梳理,时间进行消耗 全埋点 * 无法在每个按钮,页面加载调用代码,只需要在应用初始化加载即可 * 用户行为触发自动上报,无需PM思考应该在哪个页面进行埋点 * 可配置化,可以选择过滤上报页面...pause时间,如果用户App在后台被强杀或者手动退出,那么下次重新使用APP的时候会进行检测Sp中的时间和当前的时间,然后进行对比,判断用户是否为重新启动APP,还是仅仅切换到后台再切换回来。...cgtrack/TrackUtils" //普通设置点击事件 if(mInterfaces.contains('android/support/design/widget/BottomNavigationView...', '(Landroid/view/ MenuItem;)Z', 'Landroid/support/design/widget/BottomNavigationView
如果您更倾向于视频的形式,请 点击这里 查看视频内容。 概述 假设您的应用使用了 BottomNavigationView。...通过这个功能,当用户选择另一个标签页 (Tab) 时,当前标签页的返回栈会被保存,而所选标签页的返回栈会被恢复。...也就是说,如果您的应用使用了为 BottomNavigationView 或 NavigationView 提供的 setupWithNavController() 方法,则只需要更新依赖库版本,便可默认启用多返回栈...为此我删除了 NavigationExtensions 类,在所有使用它的地方都替换为 NavigationUI 中标准的 setupWithNavController() 方法以将我们的 BottomNavigationView...连接到 NavController 上。
相信你在很多的博客上或者自己的项目上看过或者使用过。而现在可以通过另一个更简洁的方式,那就是Activity+ Navigation + Fragment。...它就不报错了,这句话的意思是未使用导航的许可。因为我现在还没有使用这个nav_graph.xml所以要加上这一句话告诉AS,让它放心。等我们真正去使用时,是没有影响的,去不去掉都行。 3....明明这个NavController还什么都没有做的,为什么就可以显示了呢?实际上它已经在工作了,只是你没有注意而已。...可以看到,底部的导航栏已经出来了,而且还可以点击,点击之后还有动画效果,并且图标和文字的颜色还有变化,因为实际上我只是放了灰色图标而已。...那么这些工作就都是BottomNavigationView帮我们完成的,的确是省了不少事情,当然这个动画效果和点击之后的颜色都是可以让开发者自行改的。
设计思路 既然玩那就干脆玩花一点,一步到位给中间按钮加了个简单的点击动画,点击后FAB在垂直方向上执行一次往返位移,同时底部导航栏上的凹槽大小跟随着FAB的凹陷深度动态变化,需要实现的功能点以及思路大体是下面的几个...当然了实际上不用那么麻烦一点点手动创建,贴心的AS直接有提供一键生成以上文件的快捷方式,相关依赖也会自动导入,只需新建Activity时选择Bottom Navigation Views Activity...: 创建好了带导航栏的Activity后界面默认是这样子的效果: 接下来就是根据需求在小细节上修修补补了,由于只需要显示两个导航item,另外需要在导航栏的中间给大按钮预留个空位,于是在导航栏的menu...接下来才是重头戏:需要在导航栏上绘制出凹陷的区域。...对于这样的效果我决定老老实实选择自定义BottomNavigationView,为所欲为哈哈哈!
创建destination 点击Navigation Graph文件的Design面板上的click to add a destination,可以选择现有的Fragment,也可以点击 Create...当用户通过显式深层链接打开您的应用时,任务返回堆栈会被清除,并被替换为相应的深层链接页面。当用户从深层链接页面按下返回按钮时,他们会返回到相应的导航堆栈。...在触发隐式深层链接时,返回堆栈的状态取决于是否使用 Intent.FLAG_ACTIVITY_NEW_TASK 标志启动隐式Intent。...如果该标志已设置,任务返回堆栈就会被清除,并被替换为相应的深层链接页面。与显式深层链接一样。 如果该标记未设置,您仍会位于触发隐式深层链接时所在的上一个应用的任务堆栈中。...fragment回退的堆栈,源码中是private的无法获取,通过反射的方式获取 ArrayDeque mBackStack = null; try {
Groz和Sidner[3]认为对话是一组交错的话语片段,其中一个话语片段(或话题)是一组直接相互回应的话语。在谈话中,这些轮流的顺序可能不直接跟着对方。...Dialogue Stacks 助理的问题我可以点菜吗?提示返回手头的任务:完成购买一种模式是将这些子对话视为在堆栈、预印本上存在。在审查中,新主题在引入时被推到堆栈上,并在结束后从堆栈中弹出。...由于原则上没有限制人类如何在对话中重新访问和插入话题,所以我们感兴趣的是比堆栈更灵活的结构。...先前关于修改基本RNN结构以包含此行为的归纳偏差的工作弗拉索夫等人实施了一项对话政策。和Sahay等人。这些作品旨在克服了RNNs不适合对话建模的特点。...相关工作 开放领域的Transformers Henderson等人在Reddit的一个大数据集上训练答案选择模型,对话上下文和答案都是用一个转换器编码的,它们表明这些架构可以在一个大的、多样的数据集上预先训练
创建一个新项目 在PyCharm中创建新项目的方法是:选择“File”菜单,然后选择“New Project”。您可以选择项目类型和位置,并选择要使用的解释器。...PyCharm支持多个Python解释器,并允许您在同一项目中使用不同的解释器。 3. 编写和编辑代码 创建项目后,您可以使用PyCharm的编辑器创建和编辑Python代码。...编辑器具有许多功能,例如语法高亮显示、自动补全、代码片段、代码折叠、导航、代码格式化等。 4. 调试代码 PyCharm具有内置的调试器,可以帮助您查找和解决代码中的错误。...您可以使用调试器逐行执行代码,并查看变量值和堆栈跟踪。 5. 运行代码 您可以使用PyCharm运行Python代码,无论是单个文件还是整个项目。...例如,PyCharm可以检查未使用的变量、方法和导入,查找循环引用和代码重复,并生成代码覆盖率报告。 8. 插件和扩展 PyCharm支持许多插件和扩展,可以帮助您增强和自定义IDE。
配合 BottomNavigationView 创建 Bottom Navigation Activity BottomNavigationView 以更简洁的方式来实现过去的 BottomNavigationBar..." android:title="@string/title_notifications" /> 创建 Fragment 在 res/navigation 文件夹右击选择...BottomNavigationView 引起 Fragment 切换 bottom_nav_graph.xml 中 fragment 的 id 必须和 menu 中 item 的 id 保持一致。...加了切换监听去切换 Fragment,也对 Fragment 加了监听,能够自动切换 BottomNavigationView 的 item,互相监听变化。...navigation_bottomnavigationview_1.gif Fragment 切换改变 BottomNavigationView 的 item 在 destination 上随便拖了几个
,如果创建一个基元类型的数组(使用 stackalloc 创建),它将在堆栈上分配,并且不需要垃圾回收来管理其生存期。...Span 能够指向分配给堆栈或堆上的内存块。但是,因为 Span 被定义为 ref 结构,所以它应该只驻留在堆栈上。...Span 的使用方式与数组相同,但是与数组不同,它可以引用堆栈内存,即堆栈上分配的内存、托管内存和本机内存。这为开发者提供了一种简单的方法来利用以前只有在处理非托管代码时才能获得的性能改进。...开发者可以通过使用 stackalloc 关键字来分配堆栈上的内存,该关键字分配一个未初始化的块,该块是 T[size]类型的实例。...如果开发者的数据已经在堆栈上,则不需要这样做,但是对于大型对象,这样做很有用,因为以这种方式分配的数组只有在其作用域持续存在时才存在。
Timsort 实际上借鉴了插入排序和归并排序的方法,后文将详细介绍它的具体过程。...Timsort 选择 minrun 是为了确保 minrun 等于或稍微小于 2 的倍数。 该算法选择 minrun 的范围为 32 ~ 64。...但我们更希望尽快归并,以利用刚才发现的在内存层级中仍然排名很高的 run。我们也不能「过分」延迟合并,因为它记住未合并的运行需要消耗内存,而堆栈的大小是固定的。...为了得到折衷方案,Timsort 追踪堆栈上最近的三个项,并为这些堆栈项创建了两个必须保持为 True 的规则: A > B + C B > C 其中 A、B 和 C 是堆栈中最近的三个项。...用 Tim Peters 自己的话来说: 一个好的折衷方案是在堆栈项上维护两个不变量,其中 A、B 和 C 是最右边三个还未归并片段的长度。 通常,将不同长度的相邻 run 归并在一起是很难的。
最终的理想效果在【译】Android材质组件的动手实践:Bottom App Bar 这篇文章最下面 4.BottomNavigationView 用法和之前的 NavigationBarView 基本一致...BottomNavigationView.png 5.BottomSheetBehavior 底页是包含补充屏幕内容的表面组件。...Chip && ChipGroup.png 11.MaterialDatePicker 年月日的选择器,用法 val builder = MaterialDatePicker.Builder.datePicker...15.TextInputLayout 和android 5.0的时候推出的TextInputLayout差别不大,用法在这里 16.MaterialTimePicker google自带的时间选择器,用法如下...MaterialTimePicker.gif 本人不推荐,主要有两方面,第一,确实挺难看的,一般还是按照ios的来做,做成底部滚轮的那种。第二,builder的可配置项太少了,做不了什么修改
领取专属 10元无门槛券
手把手带您无忧上云