2010-11-13 20 views
23

Dianne Hackborn mencionó un par de hilos que puede detectar cuando se cambia el tamaño de un diseño, por ejemplo, cuando el teclado virtual se abre o se cierra. Tal hilo es este ... http://groups.google.com/group/android-developers/browse_thread/thread/d318901586313204/2b2c2c7d4bb04e1b¿Cómo detectar un cambio de tamaño de diseño?

Sin embargo, no entendí su respuesta: "Por su jerarquía de vista se cambia el tamaño con todos los cruces de diseño y devoluciones de llamada correspondientes".

¿Alguien tiene una descripción más detallada o algunos ejemplos de cómo detectar esto? ¿A qué devolución de llamada puedo conectar para detectar esto?

Gracias

Respuesta

39

Anulación onSizeChanged en su View!

+2

Esperaba un método que no requiriera la creación de subclases de la vista, pero esto funciona exactamente como yo quería, gracias. Para obtener la llamada a la actividad principal de la vista, creé un oyente en la vista subclase que llama a la actividad que se ha cambiado de tamaño. Gracias de nuevo. – cottonBallPaws

+0

@dacwe cómo dejar de cambiar el tamaño del diseño ' – PriyankaChauhan

3

Mi solución es agregar una vista pequeña e invisible al final del diseño/fragmento (o agregarla como fondo), por lo tanto, cualquier cambio en el tamaño del diseño activará el evento de cambio de diseño para esa vista que podría ser apresado por OnLayoutChangeListener:

Ejemplo de añadir la vista mudo hasta el final de la disposición:

<View 
    android:id="@+id/theDumbViewId" 
    android:layout_width="1dp" 
    android:layout_height="1dp" 
    /> 

Escuchar evento:

View dumbView = mainView.findViewById(R.id.theDumbViewId); 
    dumbView.addOnLayoutChangeListener(new OnLayoutChangeListener() { 
     @Override 
     public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
      // Your code about size changed 
     } 
    }); 
20

Una forma es Vista. addOnLayoutChangeListener. No es necesario subclasificar la vista en este caso. Pero sí necesita el nivel 11 de API. Y el cálculo correcto del tamaño de los límites (no documentados en la API) a veces puede ser una trampa. He aquí un ejemplo correcto:

public void onLayoutChange(View v, int left, int top, int right, int bottom, 
    int leftWas, int topWas, int rightWas, int bottomWas) 
{ 
    int widthWas = rightWas - leftWas; // right exclusive, left inclusive 
    if(v.getWidth() != widthWas) 
    { 
     // width has changed 
    } 
    int heightWas = bottomWas - topWas; // bottom exclusive, top inclusive 
    if(v.getHeight() != heightWas) 
    { 
     // height has changed 
    } 
} 

Otra forma (como dacwe respuestas) es una subclase de la vista y anular onSizeChanged.

+0

Debe ser la respuesta seleccionada –

+0

¡Esto es realmente útil! Inteligente y hermosa :) –

Cuestiones relacionadas