recuperar personalizar pantalla ocultar notificaciones iconos icono estado como bloqueo barra activar android statusbar

pantalla - personalizar barra de estado android



Altura de la barra de estado en Android (20)

¿Cuál es la altura de la barra de estado en Android? ¿Es siempre lo mismo?

Según mis mediciones, parece que es 25dp, pero no estoy seguro si tiene la misma altura en todas las plataformas.

(Quiero saber esto para implementar correctamente una transición de desvanecimiento de una actividad que no tiene barra de estado a una que sí la tiene)


240x320 - 20px

320x480 - 25px

480x800 + - 38px


Codificar el tamaño o usar la reflexión para obtener el valor de status_bar_height se considera una mala práctica. Chris Banes habló de esto en el Droidcon New York . La forma recomendada de obtener el tamaño de la barra de estado es a través de OnApplyWindowInsetsListener :

myView.setOnApplyWindowInsetsListener { view, insets -> { val statusBarSize = insets.systemWindowInsetTop return insets }

Esto se agregó en la API 20 y también está ViewAppCompat través de ViewAppCompat .


De todos los ejemplos de código que he usado para obtener la altura de la barra de estado, el único que realmente parece funcionar en el método onCreate de una Activity es este:

public int getStatusBarHeight() { int result = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = getResources().getDimensionPixelSize(resourceId); } return result; }

Al parecer, la altura real de la barra de estado se mantiene como un recurso de Android. El código anterior se puede agregar a una clase de ContextWrapper (por ejemplo, una Activity ).

Encontrado en http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android/


En Android 4.1 y versiones posteriores, puede configurar el contenido de su aplicación para que aparezca detrás de la barra de estado, de modo que el contenido no cambie de tamaño a medida que la barra de estado se oculta y se muestra. Para hacer esto, usa SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN. También es posible que necesites usar SYSTEM_UI_FLAG_LAYOUT_STABLE para ayudar a tu aplicación a mantener un diseño estable.

Cuando utiliza este enfoque, es su responsabilidad asegurarse de que las partes críticas de la interfaz de usuario de su aplicación (por ejemplo, los controles integrados en una aplicación de Mapas) no terminen cubiertos por las barras del sistema. Esto podría hacer que su aplicación sea inutilizable. En la mayoría de los casos, puede manejar esto agregando el atributo android: fitsSystemWindows a su archivo de diseño XML, establecido en verdadero. Esto ajusta el relleno del grupo de vista principal para dejar espacio para las ventanas del sistema. Esto es suficiente para la mayoría de las aplicaciones.

En algunos casos, sin embargo, es posible que deba modificar el relleno predeterminado para obtener el diseño deseado para su aplicación. Para manipular directamente cómo se despliega su contenido en relación con las barras del sistema (que ocupan un espacio conocido como "inserciones de contenido" de la ventana), anule fitSystemWindows (inserciones Rect). El método fitSystemWindows () es llamado por la jerarquía de vistas cuando las inserciones de contenido para una ventana han cambiado, para permitir que la ventana ajuste su contenido en consecuencia. Al anular este método, puede manejar las inserciones (y, por lo tanto, el diseño de su aplicación) como desee.

formulario: https://developer.android.com/training/system-ui/status.html#behind


En dispositivos MDPI, la barra de estado es 25px. Podemos usar esto como base y multiplicarlo por la densidad (redondeado hacia arriba) para obtener la altura de la barra de estado en cualquier dispositivo:

int statusBarHeight = Math.ceil(25 * context.getResources().getDisplayMetrics().density);

Para referencia: ldpi = .75, mdpi = 1, hdpi = 1.5, xhdpi = 2


Este problema recientemente se volvió relevante para mí debido a la muesca en mi Pixel 3XL. Realmente me gustó la solución del desarrollador de Android , pero quería poder obtener la altura de la barra de estado a voluntad, ya que era específicamente necesario para una animación de pantalla completa que necesitaba para jugar. La siguiente función permitió una consulta confiable:

private val DEFAULT_INSET = 96 fun getInsets(view: View?): Int { var inset = DEFAULT_INSET if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//Safe because only P supports notches inset = view?.rootWindowInsets?.stableInsetTop ?: DEFAULT_INSET } return inset }



He fusionado algunas soluciones juntas:

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); }

otra alternativa:

final View view = findViewById(android.R.id.content); runJustBeforeBeingDrawn(view, new Runnable() { @Override public void run() { int statusBarHeight = getResources().getDisplayMetrics().heightPixels - view.getMeasuredHeight(); } });

EDITAR: Alternativa a ejecutar JustBeforeBeingDrawn: https://.com/a/28136027/878126



La altura predeterminada solía ser 25dp. Con Android Marshmallow (API 23) la altura se redujo a 24dp.


La razón por la que la respuesta principal no funciona para algunas personas es porque no puede obtener las dimensiones de una vista hasta que esté lista para representarse. Use un OnGlobalLayoutListener para obtener dichas dimensiones cuando realmente pueda:

@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 } } }

Este es el método más confiable.


Para resolver esto, utilicé un enfoque de combinación. Esto es necesario ya que en las tabletas la barra del sistema ya resta sus píxeles cuando se llama a display.getHeight (). Así que primero verifico si hay una barra de sistema, y ​​luego Ben Claytons se acerca, lo que funciona bien en los teléfonos.

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; }


Prueba esto:

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 );

no me funcionó en el método onCreate para la actividad, pero sí cuando lo puse en un onClickListener y me dio una medida de 25


Sí, cuando lo intento con Ver, proporciona el resultado de 25px. Aquí está el código completo:

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); } } } }


Según las pautas de diseño de Google ; La altura de la barra de estado es de 24 dp.

Si desea obtener la altura de la barra de estado en píxeles, puede utilizar el siguiente método:

private static int statusBarHeight(android.content.res.Resources res) { return (int) (24 * res.getDisplayMetrics().density); }

Que se puede llamar desde la actividad con:

statusBarHeight(getResources());


Si conoces exactamente el tamaño VS altura

me gusta

por ejemplo, en un dispositivo con un tamaño de pantalla de 320 X 480, la altura de la barra de estado es de 25 píxeles, para un dispositivo con 480 x 800 la altura de la barra de estado debe ser de 38 píxeles

luego puede obtener el ancho de su vista / el tamaño de la pantalla, solo puede usar una instrucción if else para obtener la altura de la barra de estado


Tengo el mismo problema de tener que obtener la altura de la barra de estado en un onCreate. Esto funciona para mi

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;

Dentro del 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; }

Ver:

http://developer.android.com/reference/android/util/DisplayMetrics.html http://developer.android.com/guide/practices/ui_guidelines/icon_design.html


esta pregunta fue respondida antes ... Altura de la barra de estado?

Actualizar ::

Método actual:

ok, la altura de la barra de estado depende del tamaño de la pantalla, por ejemplo, en un dispositivo con un tamaño de pantalla de 240 X 320, la altura de la barra de estado es 20px, para un dispositivo con un tamaño de pantalla de 320 X 480 la altura de la barra de estado es 25px dispositivo con 480 x 800 la altura de la barra de estado debe ser 38px

así que recomiendo usar este script para obtener la altura de la barra de estado

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);

(Método antiguo) para obtener la Altura de la barra de estado en el método onCreate() de su Actividad, use este método:

public int getStatusBarHeight() { int result = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = getResources().getDimensionPixelSize(resourceId); } return result; }


la altura de la barra de estado es 24dp en 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>

Puede encontrar la respuesta en el código fuente: frameworks / base / core / res / res / values ​​/ dimens.xml


Solución de pantalla completa activada:

Esta solución puede parecer una solución alternativa, pero en realidad cuenta si su aplicación está en pantalla completa (también oculta la barra de estado) o no:

Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int barheight = size.y - findViewById(R.id.rootView).getHeight();

De esta manera, si tu aplicación está actualmente en pantalla completa, barheight será igual a 0.

Personalmente tuve que usar esto para corregir las coordenadas absolutas de TouchEvent para tener en cuenta la barra de estado como tal:

@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 eso obtendrá la coordenada y absoluta si la aplicación se muestre en pantalla completa o no.

Disfrutar