9

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

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

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

4

3 回答 3

5

如果您使用的是 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)

于 2013-01-18T23:17:10.613 回答
3

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

所以我做了一个假设:

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

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

<!-- 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() 方法中获取操作栏高度:

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;

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

于 2012-11-09T08:09:57.137 回答
2

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

编辑:

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

您可能想阅读这些答案和行动栏大师亚当鲍威尔的后续评论:

于 2012-04-16T04:19:23.293 回答