【问题标题】:Determine if action bar is split确定操作栏是否拆分
【发布时间】:2012-04-11 12:00:31
【问题描述】:

我有一个MapView,带有一个由 ActionBarSherlock 提供支持的操作栏。操作栏既是拆分的(在“窄”屏幕上)又是覆盖/半透明的(android:windowActionBarOverlay 为真)。或多或少类似于 Google 地图应用。

现在我想将视图推送到地图顶部,在屏幕底部仍然保持在底部操作栏上方。我的问题是我不知道底部操作栏的高度。坦率地说,我什至找不到办法知道它是否被绘制。 getHeight() 似乎返回了顶部操作栏的高度(或者可能是两者的高度,但我仍然不知道底部操作栏是否存在。

请告诉我这些信息就在我眼前!

【问题讨论】:

    标签: android android-actionbar actionbarsherlock


    【解决方案1】:

    如果您使用的是 ActionBarSherlock,您可以查找布尔值 abs__split_action_bar_is_narrow

    只需创建一些你可以做的静态方法

    return ResourcesCompat.getResources_getBoolean(context,
                                R.bool.abs__split_action_bar_is_narrow);
    

    您需要使用 ResourcesCompat(来自 actionbarsherlock)类,因为 3.2 之前的版本无法读取带有指标的文件夹(如 values-sw480)

    【讨论】:

    • 这在 API 3.1 + 中仍然有效吗?即,如果 ActionBarSherlock 实际上是在使用本机操作栏?
    • 感谢您的反馈,感谢 - 希望能帮助其他用户。
    【解决方案2】:

    我遇到了同样的问题。在纵向模式下的手机设备上,操作栏是分开的。因此菜单项位于顶部操作栏中,选项卡位于下方的第二个操作栏(选项卡栏)中。我只是没有找到任何可能的方法来确定操作栏的高度:在构建屏幕之前查看屏幕上剩余的空间。

    所以我做了一个假设:

    • 在小型和普通屏幕尺寸的设备上,操作栏以纵向模式拆分
    • 在大屏幕设备(如 Nexus 7)上,操作栏也以纵向模式拆分
    • 在超大屏幕尺寸设备(平板电脑)上,操作栏不会在纵向模式下拆分

    所以我区分了不同的屏幕尺寸并创建了一个布尔资源

    <!-- res/values/booleans.xml -->
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <bool name="is_split_actionbar">false</bool>
    </resources>
    
    <!-- res/values-small-port/booleans.xml
         res/values-normal-port/booleans.xml
         res/values-large-port/booleans.xml -->
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <bool name="is_split_actionbar">true</bool>
    </resources>
    

    在代码中我访问这样的值:

    Boolean isSplit = getResources().getBoolean(R.bool.is_split_actionbar);
    

    在onCreateView()方法中获取actionbar的高度:

    TypedValue typedVal = new TypedValue();
    getActivity().getTheme().resolveAttribute(R.attr.actionBarSize, typedVal, true); // use android.R when not using ABS
    int actionBarHeight = getResources().getDimensionPixelSize(typedVal.resourceId);
    

    如果操作栏被拆分,则高度加倍:

    if(isSplit) 
        actionBarHeight = actionBarHeight * 2;
    

    这不是一个理想的解决方案,但对我来说这是可行的。

    【讨论】:

    • 解决方案的最接近答案。
    • 在我看来,这个假设是基于一个错误的前提:我的操作栏在 Nexus 4 上分裂,但在 Nexus 7 上没有。
    • Nexus 7 API 25 Android Studio 模拟器上也没有拆分。
    【解决方案3】:

    底部栏应与常规操作栏的高度匹配。因此,在 XML 中使用 ?android:attr/actionBarSize(或在 ActionBarSherlock 的情况下为 ?attr/actionBarSize)或在代码中使用 getResources().getDimensionPixelSize(R.attr.actionBarSize) 就足够了。

    编辑:

    呃,在第二次阅读您的问题时,它似乎更侧重于确定拆分操作栏是否存在。

    您可能想阅读这些答案以及动作栏大师 Adam Powell 的后续 cmets:

    【讨论】:

    • 是的,我还需要知道它是否存在。无论如何,我在 Android Office Hours 上被告知(我认为是 Roman)这根本是不可能的。至少不是以一种简单直接的方式。因此,我们现在正在尝试使用单个顶部操作栏,并使用常规视图来模拟底部操作栏。这不仅解决了这个问题,而且还解决了另一个问题,我们希望将某些操作“强制”到顶部操作栏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多