Android の座標系に問題があるようです。( を要求せずにFEATURE_NO_TITLE
) 通常のビューを取得したら、 を取得しますint contentViewTop = window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
。これにより、ステータスバーとタイトルバーが得られ76px
ます。38px
38px
ただし、リクエストFEATURE_NO_TITLE
してから手順を繰り返すと、ステータスバーがまだ表示されているにもかかわらず、getTop()
が返されます!0px
通常、コンテンツ ビューがどこから始まるかは気にしないため、この不一致は違いを生むことはありません。ただし、表示されているウィンドウ全体をカバーする装飾ビューにビューを配置しているため、私にとっては重要です。
0
カスタム タイトルバーを要求して高さを指定すると、getTop()
が返されるため、これはタイトルバーとデバイスの密度のトリックではないことがわかっています38px
。
解決策/回避策は、リクエスト時に 38 ピクセルを手動で追加することFEATURE_NO_TITLE
です。私の質問は:これは Android のバグですか? または、この動作を理解できるようにするレイアウトの仕組みについて、私が理解していないことがありますか?
前もって感謝します!
問題を再現する最小限のプログラムを次に示します。2 回実行し、示された行のコメントを外します。私は Android SDK 7 に対してコンパイルし、Android 2.3.4 を搭載した Samsung Galaxy S で実行しています。
レイアウト:main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layoutParent"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<LinearLayout
android:id="@+id/someId"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</LinearLayout>
</RelativeLayout>
コード:TestStatusBarActivity.java
package com.test.teststatusbar;
import android.app.Activity;
import android.graphics.Color;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.Window;
import android.widget.RelativeLayout;
public class TestStatusBarActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Uncomment the following line to see the alternate behavior
//requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
RelativeLayout layoutParent = (RelativeLayout) findViewById(R.id.layoutParent);
View something = findViewById(R.id.someId);
something.setBackgroundColor(Color.CYAN);
ViewTreeObserver vto = layoutParent.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// decor window top
Rect rectgle = new Rect();
Window window = getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
int StatusBarHeight = rectgle.top;
// "content view" top
int contentViewTop = window.findViewById(
Window.ID_ANDROID_CONTENT).getTop();
int TitleBarHeight = contentViewTop - StatusBarHeight;
Log.i("STATUSBARTEST", "StatusBar Height = " + StatusBarHeight
+ " , TitleBar Height = " + TitleBarHeight
+ ", Content top = " + contentViewTop);
}
});
}
}