使用ActionBarSherlock; 遇到2.2和ICS/JB之间的View.getLocationOnScreen()不一致

Tre*_*vor 2 android actionbarsherlock

RelativeLayout的大小占据了包含的所有屏幕区域Activity.也就是说,它会填充除通知栏以外的所有屏幕区域.

我正在使用ActionBarSherlock.ActionBar设置为覆盖模式使用getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY).因此,我的RelativeLayout跨度从通知栏的正下方直到屏幕的底部,以及View它所拥有的任何子项都可能放在ActionBar后面.因此ActionBar肯定在叠加模式下运行.我确认在运行2.2,4.0.x(ICS)和4.1(JB)的设备上就是这种情况.

因为我的应用程序在其中实现了拖放机制RelativeLayout,我需要知道布局在屏幕上的位置,以便我可以更正返回的绝对屏幕Y触摸值getRawY().为了实现这一目标,布局阶段已经完成之后,我一直在呼吁mRelativeLayout.getLocationOnScreen()的内部onWindowFocusChanged().

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

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

有关SO的一些问题涉及令人难以置信的结果getLocationOnScreen(); 一个在这里有一个答案,给了我的想法,只是放弃getLocationOnScreen(),而是计算RelativeLayout顶级Ÿ通过从总屏幕高度减去布局的高度偏移:

DisplayMetrics dm = new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(dm);
int mRelativeLayoutYOffs = dm.heightPixels - mRelativeLayout.getMeasuredHeight(); 
Run Code Online (Sandbox Code Playgroud)

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

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

如果不这样做,是否有任何关于确定RelativeLayout顶部和左侧屏幕位置的方法的建议,以便纠正绝对屏幕触摸值?

Tre*_*vor 5

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

<item name="android:windowActionBarOverlay">true</item>
<item name="windowActionBarOverlay">true</item>
Run Code Online (Sandbox Code Playgroud)

此外,我说在2.2中ABS正在以叠加模式工作 - 实际上并非如此.现在我正在使用上面的样式项,它现在在2.2中以叠加模式工作.

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