2

RelativeLayout含むに使用できるすべての画面領域を占めるサイズのがありますActivity。つまり、通知バーを除くすべての画面領域に表示されます。

ActionBarSherlockを使用しています。ActionBarは、を使用してオーバーレイモードに設定されますgetWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY)。したがって、私のRelativeLayoutスパンの高さは、通知バーのすぐ下から画面の一番下までであり、Viewそれが保持している子は、アクションバーの後ろに配置される可能性があります。したがって、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()すでに通知バーの高さとABSの高さを足したY値を返していることです。これは、ABSがオーバーレイモードに設定されている場合でも当てはまります。

からの信じられない結果に関して、SOに関するいくつかの質問がありgetLocationOnScreen()ます。ここにあるのは、画面全体の高さからレイアウトの高さを差し引くことによって、単に放棄しgetLocationOnScreen()、代わりに上部のYオフセットを計算するという考えを私に与える答えを持っています。RelativeLayout

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

しかし、これの結果について私が奇妙だと思うのは、それが私が得たのと同じ矛盾を私に与えるように見えるということですgetLocationOnScreen()。2.2で何が起こるかというと、ABSがオーバーレイに設定.getMeasuredHeight()されてて、それが確実にオーバーレイモード。RelativeLayoutRelativeLayout

現時点で私が考えることができる最善の戦略は getLocationOnScreen()、オペレーティングシステムのバージョンに応じて結果を異なる方法で処理することです。2.2の場合、ABSの高さが含まれていることがわかります。4.0以降の場合はそうではありません。2.2から4.0の間の何か、私はまだわかりません。おそらく人々はそれらの詳細を記入するのを手伝うことができます。おそらく違いはActionBarをネイティブにサポートするOSバージョンに導入されていますか?それが予測可能であり、動作が何であるかが明確に定義されている場合、これが安全な戦略になることを願っています。

RelativeLayoutそれができない場合、絶対的な画面タッチ値を修正するために、画面の上部と左側の位置を決定する他の方法についての提案はありますか?

4

1 に答える 1

5

問題は、私が を使うべきではなかったからgetWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY)です。代わりに、私のカスタム スタイル (親の ActionBarSherlock テーマから継承する) には以下を含める必要がありました。

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

さらに、2.2 では ABS がオーバーレイ モードで動作していたというのは間違いでした。実際、そうではありませんでした。上記のスタイル アイテムを使用しているので、2.2 でオーバーレイ モードで動作するようになりました。

.getLocationOnScreen()2.2、4.0、および 4.1 デバイスの通知バーの高さのみを表す Y 値を正しく返すようになりました。

于 2012-07-27T13:03:58.850 に答える