Высота строки состояния в Android
какова высота строки состояния в Android? Это всегда одно и то же?
из моих измерений кажется, что это 25dp, но я не уверен, что он имеет одинаковую высоту на всех платформах.
(Я хочу знать это, чтобы правильно реализовать переход fade от действия, которое не имеет строки состояния к тому, что делает)
19 ответов
на этот вопрос был дан ответ раньше... высота строки состояния?
обновление::
текущий метод:
ok, высота строки состояния зависит от размера экрана, например, в устройстве с размером экрана 240 X 320 высота строки состояния 20px, для устройства с размером экрана 320 X 480 высота строки состояния 25px, для устройства с 480 x 800 высота строки состояния должна быть 38px
поэтому я рекомендую использовать этот скрипт для получения строки состояния height
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("*** Elenasys :: ", "StatusBar Height= " + statusBarHeight + " , TitleBar Height = " + titleBarHeight);
(старый метод), чтобы получить высоту строки состояния на onCreate()
метод вашей деятельности, используйте этот метод:
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
из всех образцов кода, которые я использовал для получения высоты строки состояния, единственный, который действительно работает в onCreate
метод Activity
это:
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
по-видимому, фактическая высота строки состояния сохраняется как ресурс Android. Приведенный выше код можно добавить в ContextWrapper
класса (например,Activity
).
найдено на http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android/
на устройствах MDPI строка состояния 25px. Мы можем использовать это как основание и умножить его на плотность (округлено), чтобы получить высоту строки состояния на любом устройстве:
int statusBarHeight = Math.ceil(25 * context.getResources().getDisplayMetrics().density);
для справки: ldpi=.75, mdpi=1, hdpi=1.5, xhdpi=2
по данным рекомендации по дизайну Google; высота строки состояния 24 dp.
Если вы хотите получить высоту строки состояния в пикселях, вы можете использовать следующий метод:
private static int statusBarHeight(android.content.res.Resources res) {
return (int) (24 * res.getDisplayMetrics().density);
}
который можно вызвать из activity с помощью:
statusBarHeight(getResources());
Я объединил некоторые решения вместе:
public static int getStatusBarHeight(final Context context) {
final Resources resources = context.getResources();
final int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0)
return resources.getDimensionPixelSize(resourceId);
else
return (int) Math.ceil((VERSION.SDK_INT >= VERSION_CODES.M ? 24 : 25) * resources.getDisplayMetrics().density);
}
другой вариант:
final View view = findViewById(android.R.id.content);
runJustBeforeBeingDrawn(view, new Runnable() {
@Override
public void run() {
int statusBarHeight = getResources().getDisplayMetrics().heightPixels - view.getMeasuredHeight();
}
});
EDIT: альтернатива runJustBeforeBeingDrawn:https://stackoverflow.com/a/28136027/878126
это также работает с refrence ссылке
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
Hardcoding размер или использование отражения, чтобы получить значение status_bar_height
считается плохой практикой. Крис Бейнс говорили об этом в Droidcon в Нью-Йорке. Рекомендуемый способ получения размера строки состояния - через OnApplyWindowInsetsListener:
myView.setOnApplyWindowInsetsListener { view, insets -> {
val statusBarSize = insets.systemWindowInsetTop
return insets
}
Это было добавлено в API 20 и также передается через ViewAppCompat.
у меня такая же проблема с тем, чтобы получить высоту строки состояния в onCreate. Это работает для меня.
private static final int LOW_DPI_STATUS_BAR_HEIGHT = 19;
private static final int MEDIUM_DPI_STATUS_BAR_HEIGHT = 25;
private static final int HIGH_DPI_STATUS_BAR_HEIGHT = 38;
внутри onCreate:
DisplayMetrics displayMetrics = new DisplayMetrics();
((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(displayMetrics);
int statusBarHeight;
switch (displayMetrics.densityDpi) {
case DisplayMetrics.DENSITY_HIGH:
statusBarHeight = HIGH_DPI_STATUS_BAR_HEIGHT;
break;
case DisplayMetrics.DENSITY_MEDIUM:
statusBarHeight = MEDIUM_DPI_STATUS_BAR_HEIGHT;
break;
case DisplayMetrics.DENSITY_LOW:
statusBarHeight = LOW_DPI_STATUS_BAR_HEIGHT;
break;
default:
statusBarHeight = MEDIUM_DPI_STATUS_BAR_HEIGHT;
}
посмотреть:
http://developer.android.com/reference/android/util/DisplayMetrics.html http://developer.android.com/guide/practices/ui_guidelines/icon_design.html
Да, когда я пробую его с видом, он предоставляет результат 25px. Вот весь код :
public class SpinActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout lySpin = new LinearLayout(this);
lySpin.setOrientation(LinearLayout.VERTICAL);
lySpin.post(new Runnable()
{
public void run()
{
Rect rect = new Rect();
Window window = getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rect);
int statusBarHeight = rect.top;
int contentViewTop =
window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
int titleBarHeight = contentViewTop - statusBarHeight;
System.out.println("TitleBarHeight: " + titleBarHeight
+ ", StatusBarHeight: " + statusBarHeight);
}
}
}
}
официальная высота 24dp
,
как официально заявлено Google на веб-страница дизайна Android.
высота по умолчанию используется для 25dp. С Android Marshmallow (API 23) высота была уменьшена до 24dp.
попробуйте это:
Rect rect = new Rect();
Window win = this.getWindow();
win.getDecorView().getWindowVisibleDisplayFrame(rect);
int statusBarHeight = rect.top;
int contentViewTop = win.findViewById(Window.ID_ANDROID_CONTENT).getTop();
int titleBarHeight = contentViewTop - statusBarHeight;
Log.d("ID-ANDROID-CONTENT", "titleBarHeight = " + titleBarHeight );
он не работал для меня в методе onCreate для активности, но сделал, когда я положил его в onClickListener и дал мне измерение 25
чтобы решить эту проблему, я использовал комбинированный подход. Это необходимо, так как на планшетах системная панель уже вычитает пиксели при отображении.getHeight() называется. Поэтому я сначала проверяю, присутствует ли системная панель, а затем подходит Бен Клейтонс, который отлично работает на телефонах.
public int getStatusBarHeight() {
int statusBarHeight = 0;
if (!hasOnScreenSystemBar()) {
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
statusBarHeight = getResources().getDimensionPixelSize(resourceId);
}
}
return statusBarHeight;
}
private boolean hasOnScreenSystemBar() {
Display display = getWindowManager().getDefaultDisplay();
int rawDisplayHeight = 0;
try {
Method getRawHeight = Display.class.getMethod("getRawHeight");
rawDisplayHeight = (Integer) getRawHeight.invoke(display);
} catch (Exception ex) {
}
int UIRequestedHeight = display.getHeight();
return rawDisplayHeight - UIRequestedHeight > 0;
}
высота строки состояния 24dp в android 6.0
<!-- Height of the status bar -->
<dimen name="status_bar_height">24dp</dimen>
<!-- Height of the bottom navigation / system bar. -->
<dimen name="navigation_bar_height">48dp</dimen>
вы можете найти ответ в исходном коде: Framework\base\core\res\res\values\dimens.в XML
Переключить Разрешение В Полноэкранном Режиме:
Это решение может выглядеть как обходной путь, но на самом деле он учитывает, является ли ваше приложение полноэкранным (он же скрывает строку состояния) или нет:
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point(); display.getSize(size);
int barheight = size.y - findViewById(R.id.rootView).getHeight();
таким образом, если ваше приложение в настоящее время полноэкранные, barheight
будет равна 0.
лично я должен был использовать это, чтобы исправить абсолютные координаты TouchEvent для учета строки состояния так:
@Override
public boolean onTouch(View view,MotionEvent event) {
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point(); display.getSize(size);
int YCoord = (int)event.getRawY() - size.y + rootView.getHeight());
}
и это получит Абсолют y-координата, будет ли приложение полноэкранным или нет.
наслаждайтесь
на Android 4.1 и выше, вы можете установить содержание вашего приложения, чтобы появиться за строку состояния, так что содержание не изменяет размер, как строка состояния скрывает и показывает. Для этого используйте SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN. Вам также может потребоваться использовать SYSTEM_UI_FLAG_LAYOUT_STABLE, чтобы помочь вашему приложению поддерживать стабильный макет.
при использовании этого подхода вы несете ответственность за обеспечение того, чтобы критические части пользовательского интерфейса вашего приложения (например, встроенные элементы управления в картах применение) не заканчивайте тем, что покрываетесь системными барами. Это может сделать ваше приложение непригодным. В большинстве случаев вы можете справиться с этим, добавив атрибут android:fitsSystemWindows в файл макета XML, установленный в true. Это регулирует заполнение родительской группы просмотра, чтобы оставить место для системных окон. Этого достаточно для большинства приложений.
в некоторых случаях, однако, вам может потребоваться изменить заполнение по умолчанию, чтобы получить желаемый макет для вашего приложения. Непосредственно манипулировать как ваше содержимое раскладывается относительно системных баров(которые занимают пространство, известное как "вставки содержимого" окна), переопределяет fitsystemwindows (вставки Rect). Метод fitSystemWindows () вызывается иерархией представлений при изменении вставок содержимого для окна, чтобы позволить окну соответствующим образом настроить его содержимое. Переопределяя этот метод, вы можете обрабатывать вставки (и, следовательно, макет вашего приложения), однако вы хотеть.
форма: https://developer.android.com/training/system-ui/status.html#behind
Если вы точно знаете размер высоты против
Как
например, в устройстве с размером экрана 320 X 480 высота строки состояния составляет 25px, для устройства с 480 x 800 высота строки состояния должна быть 38px
тогда вы можете просто получить ширину вашего вида / размер экрана, вы можете просто использовать оператор if else, чтобы получить высоту строки состояния
почему верхний ответ не работает для некоторых людей, потому что вы не можете получить размеры, пока не готова предоставить. Используйте OnGlobalLayoutListener
чтобы получить указанные размеры, когда вы действительно можете:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ViewGroup decorView = (ViewGroup) this.getWindow().getDecorView();
decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (Build.VERSION.SDK_INT >= 16) {
decorView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
// Nice one, Google
decorView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
Rect rect = new Rect();
decorView.getWindowVisibleDisplayFrame(rect);
rect.top; // This is the height of the status bar
}
}
}
Это самый надежный способ.