为什么我得到了这些高度值的差异?

3

我的屏幕分辨率是1080x1920。绿线的高度为1794,红线是63(状态栏)+ 84(标题栏)= 147,紫色线是1584。为什么我不能通过将红线和紫线相加来获得绿线的高度?

enter image description here

紫色线表示相对布局的高度,我用以下代码在onWindowFocusChanged()中找到它:
RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.myRelativeLayout);
Log.i(TAG, "Relative layout height: "+String.valueOf(relativeLayout.getHeight()));

红线代表标题栏和状态栏的高度,我使用以下代码在 onWindowFocusChanged() 中找到它:
Rect rectangle = new Rect();
Window window = getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rectangle);
int statusBarHeight = rectangle.top;
int contentViewTop = window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
int titleBarHeight= contentViewTop - statusBarHeight;

Log.i(TAG, "StatusBar Height= " + statusBarHeight + " , TitleBar Height = " + titleBarHeight);

绿色线代表整个程序的高度吗?我通过在onWindowFocusChanged()中使用以下代码找到了它。
Display mdisp = getWindowManager().getDefaultDisplay();
Log.i(TAG, "mdisp: "+String.valueOf(mdisp));
Point mdispSize = new Point();
mdisp.getSize(mdispSize);
int maxX = mdispSize.x;
int maxY = mdispSize.y;
Log.i(TAG, "Max X, Y: "+String.valueOf(maxX)+", "+String.valueOf(maxY));

XML布局文件内容:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="lt.wilkas.stackoverflowquestion.MainActivity"
    android:id="@+id/myRelativeLayout">

</RelativeLayout>

也许需要一些填充?一个阴影填充? - Vladyslav Matviienko
也许吧,但它们应该应用在哪里呢?我正在尝试解决这个问题http://stackoverflow.com/questions/39187745/how-to-implement-detection-of-a-view-being-dragged-over-another-view,但是坐标上的不一致让我感到困惑:( - wilkas
1个回答

2

您的标题栏高度不正确。正如您所看到的,您的标题栏高度在视觉上似乎超过状态栏的两倍以上。因此,请使用其他方法获取您的标题栏高度。

您可以像这样获取:

int whiteParentHeight = 0;
int titlebarHeight = 0;

public int getTitleBarHeight() {

whiteParent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {

            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                //noinspection deprecation
                whiteParent.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            } else {
                whiteParent.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }

            whiteParentHeight = whiteParent.getHeight();
            titlebarHeight = whiteParentHeight - getStatusBarHeight();

        }
    });

}


public int getStatusBarHeight() {

    int result = 0;
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");

    if (resourceId > 0) {
        result = getResources().getDimensionPixelSize(resourceId);
    }

    return result;

}

要查找默认标题栏高度,您可以使用以下代码:

final TypedArray styledAttributes = getContext().getTheme().obtainStyledAttributes(
                new int[] { android.R.attr.actionBarSize });
mActionBarSize = (int) styledAttributes.getDimension(0, 0);
styledAttributes.recycle();

希望这能帮到你。

我在状态栏中获得相同的63,但在状态栏中获得0。 - wilkas
标题栏高度的值保持为0。 - wilkas
请问您能否展示一下上述设计的XML布局文件? - Rahul Sharma
添加了XML内容。我认为边距的值是16dp。 - wilkas
1
好的。根据您选择的主题,这是您的默认标题栏。您可以通过更改主题(例如NoActionBar或No TitleBar)来删除此标题,并在布局xml文件中创建自己的标题栏。这将帮助您获得适合您的应用程序的正确尺寸。 - Rahul Sharma
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接