我们的目标是在操作栏右侧加上一个选项菜单,点击它就可显示或者隐藏操作栏的副标题。
由于操作栏是在API11级以后出现的,因此必须考虑兼容性问题。我们直接让低于API11的设备根本看不到选项菜单即可。建立res/menu-v11,将menu的xml放入其中,
添加上该选项菜单Item。
然后老步骤:1.setHasOptionsMenu(true)
2.onCreateOptionsMenu()
3.onOptionsItemSelected()
看似完美解决了问题,实际上有一个严重的bug。那就是经典的设备旋转问题。如果已经显示副标题,旋转后该副标题会为空,该选项菜单的title会变会show_subtitle
如何解决呢?有的人会想到保存fragment实例,让其在设备旋转期间处于被保留状态。这个想法很棒,但忽略了一点,无论是副标题还是选项菜单的显示问题都属于视图问题,而不管fragment实例是否会被保存,fragment视图一定会被销毁,原因是资源的重配置可能性。
无论之前有无副标题,视图重建时,都会没有。因此我们需要在fragment中添加一个flag用于存储副标题是否显示。在视图重建时根据该flag来判断是否需要显示副标题。
最后总结一下,视图层显示的数据如果是在非创建视图方法中设置的,那么在设备旋转这类改变配置的行为后,由于视图的销毁重建,就算fragment实例一直保留,也枉然。
时间: 2024-11-06 12:33:56