2

我有一个RelativeLayout它的大小占据了所有可用的屏幕区域Activity。也就是说,它会填满除通知栏以外的所有屏幕区域。

我正在使用 ActionBarSherlock。ActionBar 使用getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY). 因此,my 的高度RelativeLayout从通知栏的正下方一直延伸到屏幕的底部,并且View它所持有的任何 child 都可能被放置在 ActionBar 的后面。因此,ActionBar 肯定在覆盖模式下运行。我确认运行 2.2、4.0.x(ICS) 和 4.1(JB) 的设备就是这种情况。

因为我的应用程序在 this 中实现了拖放机制RelativeLayout,所以我需要知道布局在屏幕上的位置,以便更正由 返回的绝对屏幕 Y 触摸值getRawY()。为了实现这一点,在布局阶段完成后,我一直在mRelativeLayout.getLocationOnScreen()调用onWindowFocusChanged().

在我的 4.0 和 4.1 设备上,对 的调用getLocationOnScreen()产生了一个与最顶部通知栏的高度(以像素为单位)相匹配的 Y 值。为了确定通知栏和 ActionBar 组合的高度,我会将返回的 Y 值添加getLocationOnScreen()到 ActionBarSherlockgetHeight()方法的结果中。

问题是在 2.2 设备上进行测试时,getLocationOnScreen()返回的 Y 值已经是通知栏高度加上 ABS 高度。即使 ABS 设置为覆盖模式也是如此。

关于 SO 有一些关于令人难以置信的结果的问题getLocationOnScreen()这里有一个答案,它让我想到放弃getLocationOnScreen(),而是通过从总屏幕高度中减去布局的高度来计算RelativeLayout' 顶部 Y 偏移量:

DisplayMetrics dm = new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(dm);
int mRelativeLayoutYOffs = dm.heightPixels - mRelativeLayout.getMeasuredHeight(); 

我发现这个结果的奇怪之处在于,它似乎给了我和我从getLocationOnScreen(). 在 2.2 上发生的情况是,对.getMeasuredHeight()on的调用RelativeLayout实际上似乎给出了一个高度值,该高度值从 的实际高度中减去了 ActionBar 高度RelativeLayout即使ABS 设置为覆盖并且我已经在视觉上确认它肯定在叠加模式。

目前我能想到的最佳策略是 getLocationOnScreen()根据操作系统版本对结果进行不同的处理。如果是 2.2,那么我知道它包括 ABS 高度。如果 4.0 以后,它不会。2.2和4.0之间的任何东西,我还不确定。也许人们可以帮助填写这些细节。也许在原生支持 ActionBar 的操作系统版本中引入了差异?如果它是可预测的并且可以很好地定义行为是什么,那么希望这将是一个安全的策略。

如果做不到这一点,是否有其他方法可以确定RelativeLayout' 的顶部和左侧屏幕位置以纠正绝对屏幕触摸值?

4

1 回答 1

5

问题是因为我不应该使用getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY). Intead,我的自定义样式(继承自父 ActionBarSherlock 主题)需要包含:

<item name="android:windowActionBarOverlay">true</item>
<item name="windowActionBarOverlay">true</item>

此外,我说 2.2 上的 ABS 以覆盖模式工作是错误的——事实上,它不是。现在我正在使用上述样式项目,它现在在 2.2 中以覆盖模式工作。

.getLocationOnScreen()现在正确返回一个 Y 值,该值仅代表我的 2.2、4.0 和 4.1 设备上的通知栏高度。

于 2012-07-27T13:03:58.850 回答