为什么获得如下所示的有效屏幕大小(屏幕操作栏状态栏)会给出不同的结果?第一次启动我的片段并调用getEffectiveScreenSize它会出错(操作栏大小为0),但是第二次,其余的是正确的。
因此获取下面的操作栏大小并不可靠,为什么?什么是正确和安全的方式?
public static Point getScreenSize( Activity theActivity )
{
Display theDisplay = theActivity.getWindowManager().getDefaultDisplay();
Point sizePoint = new Point();
theDisplay.getSize( sizePoint );
return sizePoint;
}
public static int getStatusBarHeight( Activity theActivity )
{
int result = 0;
int resourceId = theActivity.getResources().getIdentifier( "status_bar_height", "dimen", "android" );
if (resourceId > 0)
{
result = theActivity.getResources().getDimensionPixelSize( resourceId );
}
return result;
}
public static int getActionBarHeight( Activity theActivity )
{
return theActivity.getActionBar().getHeight();
}
public static Point getEffectiveScreenSize( Activity theActivity )
{
Point screenSize = getScreenSize( theActivity );
screenSize.y = screenSize.y - getStatusBarHeight( theActivity ) - getActionBarHeight( theActivity );
return screenSize;
}
这一改变没有帮助:
public static int getActionBarHeight( Activity theActivity )
{
//return theActivity.getActionBar().getHeight();
int result = 0;
int resourceId = theActivity.getResources().getIdentifier( "actionbar_bar_height", "dimen", "android" );
if (resourceId > 0)
{
result = theActivity.getResources().getDimensionPixelSize( resourceId );
}
return result;
}
答案 0 :(得分:3)
我不确定为什么你的所有方法都是静态的,但是由于某些原因你还没有包含相关的代码 - 使用getEffectiveScreenSize
在哪里?
我可以给你的最佳答案必须基于假设 - 你必须在lifecycle之前的不同点调用getEffectiveScreenSize
- 在布局测量之前和/或之前操作栏已完全初始化(可能请查看callbacks related to action bar)。
如果您想拥有操作栏的布局帐户,则可以使用该维度
?android:attr/actionBarSize
如果您尝试制作或可能停止内容和操作栏重叠,则可能需要更改样式中操作栏叠加的值
<item name="android:windowActionBarOverlay">bool</item>
答案 1 :(得分:1)
确保在检查其大小之前为操作栏提供足够的时间加载。我确信有一个最佳实践方法可以做到这一点,但是现在只是尝试等待直到它已经加载(你可以尝试一个阻塞的循环,直到它不是大小为零)
答案 2 :(得分:1)
第一次测量时,ActionBar的高度 为0。等到主视图的布局完成,然后你可以测量ActionBar并做出反应。
final ViewTreeObserver vto = mainView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(
new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// Get the ActionBar height here
vto.removeGlobalOnLayoutListener(this);
}
};
);