zoukankan      html  css  js  c++  java
  • Android-操作栏之副标题

      我们的目标是在操作栏右侧加上一个选项菜单,点击它就可显示或者隐藏操作栏的副标题。

      由于操作栏是在API11级以后出现的,因此必须考虑兼容性问题。我们直接让低于API11的设备根本看不到选项菜单即可。建立res/menu-v11,将menu的xml放入其中,

    添加上该选项菜单Item。

       然后老步骤:1.setHasOptionsMenu(true)

             2.onCreateOptionsMenu()

             3.onOptionsItemSelected()

        

        看似完美解决了问题,实际上有一个严重的bug。那就是经典的设备旋转问题。如果已经显示副标题,旋转后该副标题会为空,该选项菜单的title也会变成原先创造视图时title的默认值。

        如何解决呢?有的人会想到保存fragment实例,让其在设备旋转期间处于被保留状态。这个想法很棒,但忽略了一点,无论是副标题还是选项菜单的显示问题都属于视图问题,而不管fragment实例是否会被保存,fragment视图在配置改变(如旋转设备时)一定会被销毁(而它为什么一定会被摧毁,请读者阅读http://www.cnblogs.com/JiMoRuXue/p/5045506.html)。

        无论之前有无副标题,视图重建时,都会没有。因此我们需要在fragment中添加一个flag用于存储副标题是否显示。在视图重建时根据该flag来判断是否需要显示副标题。

        

        

        最后总结一下,视图层显示的数据如果是在非创建视图方法中设置的,那么在设备旋转这类改变配置的行为后,由于视图的销毁重建,就算fragment实例一直保留,也枉然。

  • 相关阅读:
    [LintCode 614.] 二叉树的最长连续子序列 II
    [LintCode 90.] k数和 II
    [LintCode 1674.] 倒可乐
    [LintCode 797.] 到达一个数字
    [LintCode 1691.] 买卖股票的最佳时机V
    [LintCode 69. 242.] 二叉树的层次遍历
    [LintCode 229.] 栈排序
    [LeetCode 1671.] 玩游戏
    [LintCode 1668.] 区间最小覆盖
    (十)线程同步
  • 原文地址:https://www.cnblogs.com/JiMoRuXue/p/5053267.html
Copyright © 2011-2022 走看看