Android - получение размера панели действий дает противоречивый результат
Почему получение эффективного размера экрана (screen-actionbar-statusbar), как показано ниже, дает разные результаты в разное время? первый раз, когда мой фрагмент запускается и вызывает 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;
}
3 ответа
Я не уверен, почему все ваши методы являются статическими, но более важно, что по какой-то причине вы не включили соответствующий код - где getEffectiveScreenSize
используемый?
Лучший ответ, который я могу вам дать, должен основываться на предположениях - вы должны звонить getEffectiveScreenSize
в разных точках жизненного цикла - до и после измерения макета и / или до полной инициализации панели действий (возможно, посмотрите на обратные вызовы, связанные с панелью действий).
Если вы хотите, чтобы ваш макет учетной записи для панели действий, есть измерение, которое вы можете использовать для этого
?android:attr/actionBarSize
Если вы пытаетесь сделать или, возможно, остановить наложение содержимого и панели действий, вам, вероятно, придется изменить значение наложения панели действий в своих стилях.
<item name="android:windowActionBarOverlay">bool</item>
Высота ActionBar, вероятно, равна 0 при первом измерении. Дождитесь окончания макета основного вида, затем вы сможете измерить панель действий и отреагировать.
final ViewTreeObserver vto = mainView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(
new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// Get the ActionBar height here
vto.removeGlobalOnLayoutListener(this);
}
};
);
Убедитесь, что вы даете панели действий достаточно времени для загрузки, прежде чем проверять ее размер. Я уверен, что есть лучшие способы сделать это, но сейчас просто попробуйте немного подождать, пока он не загрузится (вы можете попробовать цикл, который блокирует, пока он не станет нулевого размера)