Altura de la barra de estado en Android
¿Cuál es la altura de la barra de estado en Android? ¿Siempre es lo mismo?
De mis medidas parece que es 25dp, pero no estoy seguro si tiene la misma altura en todas las plataformas.
- onTouchListener anula un fondo personalizado en la vista de botón?
- Comprobación de Wi-Fi activado o no en Android
- Cómo cambiar el color de fondo de la barra de estado de android
- ¿Cuál es el significado del registro de la etiqueta: "szipinf" y el texto: "Initializing inflate state" de Logcat
- Android: efecto saltar de la barra de estado
(Quiero saber esto para implementar correctamente una transición de desvanecimiento de una actividad que no tiene barra de estado a uno que sí)
- Botón personalizado: cambiar el estilo cuando se presiona
- Visualización de un icono en la barra de estado cuando se ejecuta mi tarea
- Android gran icono de notificación, hay una manera de eliminar el icono más pequeño en la parte inferior derecha?
- Controlar el icono de la barra de estado de android
- Navegación de actividades de Android guardar estado
- Android: guardando el estado de la aplicación al ir al "fondo"
- Cómo ocultar y mostrar la barra de estado
- Estado de sms de Android
Esta pregunta fue respondida antes de … 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 tamaño de pantalla 240 x 320 la altura de la barra de estado es 20px, para un dispositivo con 320 x 480 tamaño de pantalla 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, utilice 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; }
De todos los ejemplos de código que he utilizado para obtener la altura de la barra de estado, la única que realmente parece funcionar en el método onCreate
de una Activity
es la siguiente:
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 ContextWrapper
(por ejemplo, una Activity
).
Encontrado en http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android/
En dispositivos MDPI, la barra de estado es 25px. Podemos usar esto como base y multiplicarlo por la densidad (redondeado) para obtener la altura de la barra de estado en cualquier dispositivo:
int statusBarHeight = Math.ceil(25 * context.getResources().getDisplayMetrics().density);
Para referencia: ldpi = 0,75, mdpi = 1, hdpi = 1,5, xhdpi = 2
De acuerdo con las directrices de diseño de Google ; 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 de la actividad con:
statusBarHeight(getResources());
He combinado 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(); } });
Esto también funciona con el enlace 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; }
Tengo el mismo problema de tener que conseguir la altura de la barra de estado en un onCreate. Esto funciona para mí.
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 de la 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
Sí, cuando lo intento con Ver que 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); } } } }
La altura oficial es de 24dp
, como se indica oficialmente por Google en la página web de diseño de Android .
240×320 – 20px 320×480 – 25px 480×800 + – 38 píxeles
La altura predeterminada solía ser 25dp. Con Android Marshmallow (API 23) la altura se redujo a 24dp.
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 funcionó para mí en el método onCreate para la actividad, pero lo hice cuando lo puse en un onClickListener y me dio una medida de 25
Para resolver esto, usé un enfoque de combinación. Esto es necesario como en las tabletas la barra del sistema ya se resta de los píxeles cuando display.getHeight () se llama. Así que primero comprobar si una barra del sistema está presente, y luego Ben Claytons enfoque, 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; }
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 \ valores \ dimens.xml
Solución de pantalla completa con conmutación:
Esta solución puede parecer una solución, pero en realidad explica si su aplicación está en pantalla completa (también escondiendo 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 su aplicación está 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 de la siguiente manera:
@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 es de pantalla completa o no.
Disfrutar
Si usted sabe exactamente el tamaño VS altura
me gusta
Por ejemplo en un dispositivo con 320 X 480 tamaño de pantalla la altura de la barra de estado es 25px, para un dispositivo con 480 x 800 la altura de la barra de estado debe ser 38px
Entonces sólo puede obtener el ancho de su vista / el tamaño de la pantalla sólo puede utilizar una instrucción if else para obtener la altura de la barra de estado
La razón por la cual la respuesta superior no funciona para algunas personas es porque no se pueden obtener las dimensiones de una vista hasta que esté lista para procesar. Usa un OnGlobalLayoutListener
para obtener dichas dimensiones cuando puedas:
@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.