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
}
Esto también funciona con el http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android/ referencia http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android/
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
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 oficial es 24dp
, como lo establece oficialmente Google en la página web de Android Design .
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