在我看来,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 错误吗?还是有什么我不理解的布局如何使这种行为可以理解?
提前致谢!
这是一个重现问题的最小程序。运行两次,然后取消注释指示的行。我正在针对 Android SDK 7 进行编译,并在带有 Android 2.3.4 的三星 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);
}
});
}
}