gpt4 book ai didi

android - 如何在启动时确定非全屏 Activity 窗口大小?

转载 作者:搜寻专家 更新时间:2023-11-01 08:14:29 25 4
gpt4 key购买 nike

我有一个非全屏 Activity (系统通知栏可见)。为了创建我的 View 层次结构,我需要知道我的 Activity 占用的那 block 屏幕的大小(即显示的大小减去系统通知栏的大小)。我如何在 onCreate 方法中确定这一点?

最佳答案

这在 onCreate() 中是未知的。您应该做的是正确参与 View 层次结构布局过程。您不在 onCreate() 中进行布局,而是在布局管理器的 View 层次结构中进行布局。如果您有一些无法使用标准布局管理器实现的特殊布局,则编写您自己的布局管理器非常容易——只需实现一个 ViewGroup 子类,该子类在 onMeasure() 和 onLayout() 中执行适当的操作。

这是执行此操作的唯一正确方法,因为如果可用显示尺寸发生变化,您的 onCreate() 将不会再次运行,但 View 层次结构将通过其布局过程来确定放置其 View 的正确新位置。屏幕尺寸可能会像这样改变的原因有很多——例如,在 Xoom 平板电脑上,当它插入 HDMI 输出时,它会使系统栏变大,以便在将其显示镜像为 720p 时应用程序的屏幕底部不会被截断。

例如,这里有一个实现简单版本的 FrameLayout 的布局管理器:

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
final int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = getChildAt(i);

int childRight = getPaddingLeft()
+ child.getMeasuredWidth() - getPaddingRight();
int childBottom = getPaddingTop()
+ child.getMeasuredHeight() - getPaddingBottom();
child.layout(getPaddingLeft(), getPaddingTop(), childRight, childBottom);
}
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final int count = getChildCount();

int maxHeight = 0;
int maxWidth = 0;
int measuredChildState = 0;

// Find rightmost and bottom-most child
for (int i = 0; i < count; i++) {
final View child = getChildAt(i);
if (child.getVisibility() != GONE) {
measureChild(child, widthMeasureSpec, heightMeasureSpec);
maxWidth = Math.max(maxWidth, child.getMeasuredWidth());
maxHeight = Math.max(maxHeight, child.getMeasuredHeight());
measuredChildState = combineMeasuredStates(measuredChildState,
child.getMeasuredState());
}
}

// Account for padding too
maxWidth += getPaddingLeft() + getPaddingRight();
maxHeight += getPaddingTop + mPaddingBottom();

// Check against our minimum height and width
maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight());
maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth());

setMeasuredDimension(resolveSizeAndState(maxWidth,
widthMeasureSpec, measuredChildState),
resolveSizeAndState(maxHeight, heightMeasureSpec,
measuredChildState<<MEASURED_HEIGHT_STATE_SHIFT));
}

请注意最后一行是从 API 11 开始实现测量的最佳方法,因为它允许您传播“布局不适合”等状态,可用于确定对话框需要的大小等操作是。您可能不需要担心这些事情,在这种情况下,您可以将其简化为适用于所有平台版本的形式:

    setMeasuredDimension(resolveSize(maxWidth, widthMeasureSpec),
resolveSize(maxHeight, heightMeasureSpec));

还有一个稍微复杂的布局的API演示:

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/animation/FixedGridLayout.html

关于android - 如何在启动时确定非全屏 Activity 窗口大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6229291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com