soporte - pesos layout android
Android DisplayMetrics devuelve un tamaño de pantalla incorrecto en píxeles en ICS (6)
De la respuesta de Ahmed, este es el código completo sin error:
int width = 0, height = 0;
final DisplayMetrics metrics = new DisplayMetrics();
Display display = getWindowManager().getDefaultDisplay();
Method mGetRawH = null, mGetRawW = null;
try {
// For JellyBean 4.2 (API 17) and onward
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
display.getRealMetrics(metrics);
width = metrics.widthPixels;
height = metrics.heightPixels;
} else {
mGetRawH = Display.class.getMethod("getRawHeight");
mGetRawW = Display.class.getMethod("getRawWidth");
try {
width = (Integer) mGetRawW.invoke(display);
height = (Integer) mGetRawH.invoke(display);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (NoSuchMethodException e3) {
e3.printStackTrace();
}
He intentado esto ...
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int fullscreenheight = metrics.heightPixels;
int fullscreenwidth = metrics.widthPixels;
y....
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
El Gnex tiene una pantalla de 720 × 1280. El resultado devuelto para ancho / alto (dependiendo de la orientación, por supuesto) nunca es 1280. Pensé que esto podría tener algo que ver con la barra de navegación en pantalla en Ice Cream Sandwich, por lo que oculto eso con:
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
... y luego comenzó un hilo que registra continuamente el tamaño / ancho de la pantalla. Incluso después de que la barra de navegación de ICS hubiera desaparecido por completo ... el tamaño de la pantalla nunca informaría el valor 1280. Me gustaría obtener números como este:
width = 720
height = 1184
¿Cómo se obtiene la verdadera resolución de pantalla del dispositivo en ICS?
La razón por la que necesito este valor es porque mi aplicación reproduce video y me gustaría que el video ocupe toda la pantalla cuando el dispositivo está en orientación horizontal. Ahora sé lo que estás pensando, ¿por qué no le das a la videovigilancia un valor de "match_parent" para la altura / anchura? La razón es porque mis videos tienen múltiples relaciones de aspecto y me gustaría poder calcular el tamaño correcto de video dependiendo del ancho completo de la pantalla.
En algunos dispositivos, por ejemplo, tabletas, la barra de navegación no se puede ocultar en absoluto ( source , consulte la sección ''Controles para la visibilidad de la interfaz de usuario del sistema'') porque no hay botones de hardware como copia de seguridad. Sin embargo, si en su dispositivo ha logrado ocultar la barra, podría hacer una Vista en pantalla completa y solicitar su tamaño con getWidth () y getHeight ().
Que yo sepa, no hay una manera confiable de obtener el tamaño de la pantalla en todos los dispositivos ICS.
Encontré este tesoro oculto para ICS SOLAMENTE ...... si está apuntando a API más altas que ICS, vea el comentario de Chris Schmich a continuación.
Cómo ocultar y mostrar la barra de navegación en la compilación ICS de Android
En caso de que el enlace muera ... aquí le indicamos cómo obtener el tamaño real de la pantalla del dispositivo ...
Display display = getWindowManager().getDefaultDisplay();
Method mGetRawH = Display.class.getMethod("getRawHeight");
Method mGetRawW = Display.class.getMethod("getRawWidth");
int rawWidth = (Integer) mGetRawW.invoke(display);
int rawHeight = (Integer) mGetRawH.invoke(display);
EDITAR (19/11/12)
El código anterior NO FUNCIONARÁ en Android 4.2 y se lanzará una excepción ... Todavía tengo que encontrar una manera de obtener el tamaño de pantalla completa de un dispositivo en Android 4.2. Cuando lo haga, editaré esta respuesta, pero por ahora, ¡¡deberías codificar con contingencia para Android 4.2 !!
Prueba esto
final DisplayMetrics metrics = new DisplayMetrics();
Display display = getWindowManager().getDefaultDisplay();
Method mGetRawH = null,mGetRawW = null;
try {
// For JellyBeans and onward
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN){
display.getRealMetrics(metrics);
realWidth = metrics.widthPixels;
realHeight = metrics.heightPixels;
}else{
mGetRawH = Display.class.getMethod("getRawHeight");
mGetRawW = Display.class.getMethod("getRawWidth");
try {
realWidth = (Integer) mGetRawW.invoke(display);
realHeight = (Integer) mGetRawH.invoke(display);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Puedes usar getRealSize
para obtener la resolución de la pantalla. Se admite oficialmente en API 17 y superior, pero en realidad existía en el SDK desde API 14. Si usa la plataforma SDK para API 17 o superior, puede acceder al método normalmente y simplemente omitir la advertencia de que solo está disponible en API 17.
/**
* Gets the device''s native screen resolution rotated
* based on the device''s current screen orientation.
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) //To remove warning about using
//getRealSize prior to API 17
private Point screenResolution() {
WindowManager windowManager =
(WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
Point screenResolution = new Point();
if (Build.VERSION.SDK_INT < 14)
throw new RuntimeException("Unsupported Android version.");
display.getRealSize(screenResolution);
return screenResolution;
}
He probado esto en un dispositivo Android 5.0.2 real y en un emulador que ejecuta 4.1.1 (y posiblemente otros).
Gracias a benc por señalar esto en los comentarios .
public static Point getRealSize(Display display) {
Point outPoint = new Point();
Method mGetRawH;
try {
mGetRawH = Display.class.getMethod("getRawHeight");
Method mGetRawW = Display.class.getMethod("getRawWidth");
outPoint.x = (Integer) mGetRawW.invoke(display);
outPoint.y = (Integer) mGetRawH.invoke(display);
return outPoint;
} catch (Throwable e) {
return null;
}
}
public static Point getSize(Display display) {
if (Build.VERSION.SDK_INT >= 17) {
Point outPoint = new Point();
DisplayMetrics metrics = new DisplayMetrics();
display.getRealMetrics(metrics);
outPoint.x = metrics.widthPixels;
outPoint.y = metrics.heightPixels;
return outPoint;
}
if (Build.VERSION.SDK_INT >= 14) {
Point outPoint = getRealSize(display);
if (outPoint != null)
return outPoint;
}
Point outPoint = new Point();
if (Build.VERSION.SDK_INT >= 13) {
display.getSize(outPoint);
} else {
outPoint.x = display.getWidth();
outPoint.y = display.getHeight();
}
return outPoint;
}