Queremos establecer el tamaño de nuestra disposición de forma dinámica. Para ello, es necesario conocer el tamaño de la pantalla antes de mostrar la programación de actividades, es decir, en onCreate ()
método. Saber el tamaño de pantalla o dimensión es muy fácil y el código de la línea 2, pero eso no significa que el tamaño de diseño de la aplicación también será el mismo. Para obtener el tamaño real disponible para nuestro diseño, lo que necesitamos saber el tamaño de la pantalla, la barra de título y de estado. Por último, deducir la altura de la barra de título y statusBar de la pantalla y así es como podemos conseguir la altura real de nuestro diseño. El archivo XML tiene el identificador de diseño principal como "root" de tipo LinearLayout
:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainroot"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:paddingTop="35dip"
android:paddingBottom="35dip"
android:paddingLeft="35dip"
android:paddingRight="35dip"
android:gravity="center" > .....
.....
</LinearLayout>
En onCreate ()
, para obtener el:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mainpage);
// Get the layout id
root = (LinearLayout) findViewById(R.id.mainroot);
root.post(new Runnable() {
public void run() {
Rect rect = new Rect();
Window win = getWindow(); // Get the Window
win.getDecorView().getWindowVisibleDisplayFrame(rect);
// Get the height of Status Bar
int statusBarHeight = rect.top;
// Get the height occupied by the decoration contents
int contentViewTop = win.findViewById(Window.ID_ANDROID_CONTENT).getTop();
// Calculate titleBarHeight by deducting statusBarHeight from contentViewTop
int titleBarHeight = contentViewTop - statusBarHeight;
Log.i("MY", "titleHeight = " + titleBarHeight + " statusHeight = " + statusBarHeight + " contentViewTop = " + contentViewTop); // By now we got the height of titleBar & statusBar
// Now lets get the screen size
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int screenHeight = metrics.heightPixels;
int screenWidth = metrics.widthPixels;
Log.i("MY", "Actual Screen Height = " + screenHeight + " Width = " + screenWidth); // Now calculate the height that our layout can be set
// If you know that your application doesn't have statusBar added, then don't add here also. Same applies to application bar also
int layoutHeight = screenHeight - (titleBarHeight + statusBarHeight);
Log.i("MY", "Layout Height = " + layoutHeight); // Lastly, set the height of the layout
LinearLayout.LayoutParams rootParams = (android.widget.LinearLayout.LayoutParams)root.getLayoutParams();
rootParams.height = layoutHeight;
root.setLayoutParams(rootParams);
}
});
Log.i("MY", "FINISHED OnCreate");
}
La salida de los registros:
01-12 12:28:41.916: INFO/MY(198): FINISHED OnCreate
01-12 12:28:42.196: INFO/CPP(198): titleHeight = 40 statusHeight = 25 contentViewTop = 65
01-12 12:28:43.196: INFO/CPP(198): Actual Screen Height = 480 Width = 320
01-12 12:28:43.196: INFO/CPP(198): Layout Height = 415
Razón para agregar el código en root.post (Ejecutable)
: Después de onCreate
se completa, entonces la actividad, sólo se puede saber el tamaño de la ventana y su contenido. Así que una vez onCreate ()
se ejecuta, root.post ()
ejecuta y obtiene el contenido de la decoración de las ventanas a través de la cual obtenemos la altura de la decoración y la altura de la barra de estado.
Beneficios
- El Código se agrega en
onCreate ()
, por lo que cada vez que la pantalla gira cambios / orientación, ejecución y obtener los tamaños más reciente de la ventana. - Independientemente de la densidad, el código funciona en todas las densidades y gestiona en consecuencia. Diferente densidad de diferentes tamaños de barra de título, barra de estado y puntos de vista de contenido.
- Cada vez que el diseño tiene que saber su tamaño dinámicamente para establecer la altura de sus hijos o algo así, esto puede ser la mejor opción.
Sugerencia
Si el mismo código debe ser utilizado en múltiples actividades, agregue el código en un estático
método de una clase y llamar a eso estático
método de root.post ()
y luego se puede conocer la layoutHeight
y seguir trabajando.
No hay comentarios:
Publicar un comentario