Algorithm

学习之前在微信读书群里分享的算法题
https://www.yuque.com/ricky-osxr4/pagerg/tmflld

Review

android 官网关于 navigation 的描述

Tips

以下的tips 主要来自于 android 官网,和 medium 中的关于 navigation 的相关文章。

navigation 中Fragment重建的解决方法。

navigation 一般作为 fragment 导航切换操作,切换的操作使用的是 replace() 方法,所以它 Fragment 的生命周期会重建,内部的 view 也会重新加载。
其关于Fragment的操作是在 FragmentNavigator 中进行的操作。如果在使用 navigation 切换Fragment时不想使其销毁后重建,那么我们需要重写 FragmentNavigator 中的 navigate() 方法,将其中的replace 的操作替换为 add/hide/show 的操作。另外,我们还需要在新定义的 FragmentNavigator 中添加新的类注解 。
默认的 FragmentNavigator 的注解为 @Navigator.Name("fragment") 其中 fragment 是指的是我们在编写navigation.xml时使用的fragment 标签,当执行某个action时Navigation会从中找到目标Fragment 。我们在重写 FragmentNavigator 后,需要将注解中的 name 换成我们自己想要的name,,比如 keep_state_fragment , 然后在定义 navigation.xml 的时候,使用 keep_state_fragment 替换 fragment 。由于我们的需要将默认的 FragmentNavigator 替换成我们自己的FragmentNavigator,那么我们需要在代码中替换它,然后还有通过代码设置controler 和 graph。

  1. // 这里 nav_host_fragment 指的是在Activity中作为容器的 fragment
  2. val navigatorController = Navigation.findNavController(this,R.id.tab_nav_host_fragment)
  3. val navHostFragment = supportFragmentManager.findFragmentById(R.id.tab_nav_host_fragment)
  4. val keepStateFragmentNavigator =
  5. KeepStateFragmentNavigator(
  6. this, navHostFragment!!.childFragmentManager,R.id.tab_nav_host_fragment)
  7. navigatorController.navigatorProvider.addNavigator(keepStateFragmentNavigator)
  8. navigatorController.setGraph(R.navigation.tab_home_navigation)

BottomNavigationView 自定义图标

  1. 在menu.xml 中 item 标签中 设置 icon 为需要的 selector 或者drawable
  2. 将 BottomNavigationView 的 setItemIconTintList(null)


BottomNavigationView 文字不随动画或者其它的原因消失

设置 app:labelVisibilityMode=”labeled” 则会一直显示文字

BottomNavigationView 取消文字缩放的动画

这个问题有两种方式可以解决,首先我们需要知道它的动画是如何实现的。
首先 BottomNavigationView 的每个 item 是一个 BottomNavigationMenuView ,文字就是显示在 BottomNavigationMenuView 里,它的动画是通过一个 isShifting 的私有方法来决定的,我们可以将使用反射让它始终返回false,则动画不在显示。
其次 BottomNavigationMenuView 的动画的实现是使用的两个 TextView 实现的,一个是大一点 Textview 来显示变大时的文字,一个小一些TextView 显示变小时的文字。在选中时通过计算两个TextView文字的打小抄差距的比例,然后通过 setScale 的方式来进行缩放变换。变大时将小的TextView隐藏,缩小时将大的TextView 隐藏。两个TextView 的文字大小是xml中定义的,我们只需要在dimension.xml中重写它,将两个值设置为相等的两个值就OK了,这样动画就没有效果了。

  1. <!-- 重写 BottomNavigationItemView 中的 largeLabel 和 smallLabel 的字体大小,将其动画屏蔽掉,当两个字体大小一样时,动画虽然也会执行,但是看不出效果 -->
  2. <!-- BottomNavigationItemView 文字会通过 largeLabel 和 smallLabel 的 setScaleX/Y 来实现动画的效果 -->
  3. <dimen name="design_bottom_navigation_active_text_size" tools:override="true">10sp</dimen>
  4. <dimen name="design_bottom_navigation_text_size" tools:override="true">10sp</dimen>

Share