guidelines example dev constraintlayout constraint best java android android-layout layout screen

java - dev - guidelines android example



Obtén la altura de la pantalla en Android (9)

¿Cómo puedo obtener la altura disponible de la pantalla en Android? Necesito la altura menos la barra de estado / barra de menú o cualquier otra decoración que pueda estar en pantalla y necesito que funcione para todos los dispositivos. Además, necesito saber esto en la función onCreate. Sé que esta pregunta se ha hecho antes, pero ya he probado sus soluciones y ninguna de ellas funciona. Estas son algunas de las cosas que he intentado:

He probado este código en API 7 - 17. Desafortunadamente, en API 13 hay espacio extra en la parte inferior tanto horizontal como verticalmente y en API 10, 8 y 7 no hay suficiente espacio en la parte inferior tanto horizontal como verticalmente. (No he probado en APIs obsoletas):

Display display = getWindowManager().getDefaultDisplay(); DisplayMetrics metrics = new DisplayMetrics(); display.getMetrics(metrics); screenWidth = metrics.widthPixels; screenHeight = metrics.heightPixels; TypedValue tv = new TypedValue(); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) screenHeight -= TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics()); } int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) screenHeight -= getResources().getDimensionPixelSize(resourceId);

Esto no tiene en cuenta la barra de estado / barra de menú:

Display display = getWindowManager().getDefaultDisplay(); screenWidth = display.getWidth(); screenHeight = display.getHeight();

Tampoco esto:

Point size = new Point(); getWindowManager().getDefaultDisplay().getSize(size); screenWidth = size.x; screenHeight = size.y;

Ni esto

Point size = new Point(); getWindowManager().getDefaultDisplay().getRealSize(size); screenWidth = size.x; screenHeight = size.y;

Esto no funciona:

Display display = getWindowManager().getDefaultDisplay(); DisplayMetrics metrics = new DisplayMetrics(); display.getMetrics(metrics); // since SDK_INT = 1; screenWidth = metrics.widthPixels; screenHeight = metrics.heightPixels; try { // used when 17 > SDK_INT >= 14; includes window decorations (statusbar bar/menu bar) screenWidth = (Integer) Display.class.getMethod("getRawWidth").invoke(display); screenHeight = (Integer) Display.class.getMethod("getRawHeight").invoke(display); } catch (Exception ignored) { // Do nothing } try { // used when SDK_INT >= 17; includes window decorations (statusbar bar/menu bar) Point realSize = new Point(); Display.class.getMethod("getRealSize", Point.class).invoke(display, realSize); screenWidth = realSize.x; screenHeight = realSize.y; } catch (Exception ignored) { // Do nothing }

Luego utilicé el siguiente código para restar la altura de la barra de estado y la barra de menú de la altura de la pantalla:

int result = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) result = getResources().getDimensionPixelSize(resourceId); screenHeight -= result; result = 0; if (screenHeight >= screenWidth) resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android"); else resourceId = getResources().getIdentifier("navigation_bar_height_landscape", "dimen", "android"); if (resourceId > 0) result = getResources().getDimensionPixelSize(resourceId); screenHeight -= result;

En la API 17, calcula correctamente la altura de la barra de estado y la barra de menús en vertical pero no en horizontal. En API 10, devuelve 0. Necesito que funcione idealmente en todos los dispositivos o API 7 mínimo.


Es posible que no responda a su pregunta, pero podría ser útil saber (yo mismo la estaba buscando cuando llegué a esta pregunta) que si necesita una dimensión de Vista pero su código se está ejecutando cuando aún no se ha diseñado su diseño (por ejemplo, en onCreate ()) puede configurar un ViewTreeObserver.OnGlobalLayoutListener con View.getViewTreeObserver (). addOnGlobalLayoutListener () y poner allí el código relevante que necesita la dimensión de la vista. La devolución de llamada del oyente se llamará cuando se haya distribuido el diseño.

cortesía-francesco feltrinelli

Podrías intentar hacer esto.


¿Qué hay de configurar una Vista subclasificada como la raíz de la Actividad? Haga que esta vista llene la pantalla (no pasará de la barra de estado) y anule onSizeChanged() . Almacena esos valores y escribe un captador para ellos.


No he probado diferentes API, pero estoy usando estos valores para averiguar si el teclado en pantalla está activo o no. ¿Tal vez puedas probar esto y algo comparable en cuanto al ancho para obtener lo que necesitas?

Rect r = new Rect(); view.getWindowVisibleDisplayFrame(r); int screenHeight = view.getRootView().getHeight(), // height of the entire screen appHeight = r.bottom - r.top, // height of the entire app statusBarHeight = r.top, // height of the statusbar pageHeight = view.getHeight(), // height of the app without title appTitleHeight = appHeight - pageHeight, // height of the only the app title topHeight = statusBarHeight + appTitleHeight;


Obtenga la altura del diseño raíz que está cargado por la actividad. En caso de que no llene la pantalla, colóquela dentro de otro diseño con una propiedad de altura de fill_parent.


Para mostrar

DisplayMetrics displaymetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); int height = displaymetrics.heightPixels; int width = displaymetrics.widthPixels;

Para barra de estado

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


Si desea que las dimensiones de la pantalla se muestren en píxeles, puede usar getSize :

Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; int height = size.y;

Si no estás en una Activity , puedes obtener la pantalla predeterminada a través de WINDOW_SERVICE :

WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); display.getSize(size); int width = size.x; int height = size.y;

Antes de que se introdujera getSize (en el nivel 13 de la API), podría usar los métodos getWidth y getHeight que ahora están en desuso:

Display display = getWindowManager().getDefaultDisplay(); int width = display.getWidth(); // deprecated int height = display.getHeight(); // deprecated

Referido de: Obtener las dimensiones de la pantalla en píxeles


Solución de trabajo:

Crea dos vistas ficticias:

<View android:id="@+id/top" android:layout_height="0dp" android:layout_width="match_parent" android:layout_alignParentTop="true" /> <View android:id="@+id/bottom" android:layout_height="0dp" android:layout_width="match_parent" android:layout_alignParentBottom="true" />

Ahora, debe llamar a getLocationOnScreen(int []) en estas dos vistas para recibir sus ubicaciones. Esta función devuelve una matriz de 2 enteros. El primero es x y el segundo y. Sólo requerimos y. También tenga en cuenta que los valores correctos se devuelven solo DESPUÉS de que se creen todas las vistas y se onCreate método onCreate .

Probé este código en un fragmento regular llamado desde un viewpager.

El código estaba en el método onCreateView de mi fragmento. Todavía tenía que usar un postDelayed para obtener los valores correctos.

final View top = (View) view.findViewById(R.id.top); final View bottom = (View) view.findViewById(R.id.bottom); new Handler().postDelayed(new Runnable() { @Override public void run() { int topLoc[] = new int[2]; top.getLocationOnScreen(topLoc); int BottomLoc[] = new int[2]; bottom.getLocationOnScreen(BottomLoc); Log.d(Constants.debug, "topY: "+ topLoc[1]+" BottomY:" + BottomLoc[1]); } },4000);

Tengo un Nexus 4.

En modo normal (barra de estado y los botones suaves mostrados):

07-05 02:28:23.367 565-565/com.torcellite.xx D/xx: topY: 50 BottomY:1182

En modo de pantalla completa (no se muestra la barra de estado ni los botones de software):

07-05 02:29:17.360 707-707/com.torcellite.xx D/xx: topY: 0 BottomY:1280

Todo lo que tienes que hacer ahora es restar.


final View view = findViewById(R.id.root); ViewTreeObserver vto = view.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { // calculate the height in here... ViewTreeObserver vto = view.getViewTreeObserver(); vto.removeGlobalOnLayoutListener(this); } });

Use este oyente en onCreate (disponible desde la API 1). Deberá asignar el id @+id/root al padre en su diseño xml. No hay forma de que el tamaño pueda devolver un resultado de 0, ya que este oyente realiza una devolución de llamada cuando los diseños se han colocado a la vista.


Display currentDisplay = getWindowManager().getDefaultDisplay(); float dw = currentDisplay.getWidth(); float dh = currentDisplay.getHeight();

dh te dará la altura de la pantalla.