2012-01-16 26 views
8

Esta pregunta se ha formulado varias veces, pero todos dan la razón de por qué ocurre esto (es decir, el cálculo ocurre antes de que se coloque el diseño). Pero necesito la solución para esto. Intenté getBottom();, getTop();, getLocationOnScreen(int[] location);. Pero todo devuelve el valor Cero (0). Incluso traté de dar estos en onStart();, para dar tiempo a que se coloque el diseño, pero no tuve suerte. Aquí está mi código:Métodos para obtener la posición de vista devuelve 0

TextView tv; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    tv = (TextView) findViewById(R.id.textView1); 
    Log.d("getBottom :", Integer.toString(tv.getBottom())); 
    Log.d("gettop  :", Integer.toString(tv.getTop())); 

    int[] location = new int[2]; 
    tv.getLocationOnScreen(location); 
    Log.d("getlocationonscreen values :", Integer.toString(location[0])+" "+Integer.toString(location[1])); 
} 
@Override 
protected void onStart() { 
    Log.d("getBottom in onStart :", Integer.toString(tv.getBottom())); 
    Log.d("gettop in onStart :", Integer.toString(tv.getTop())); 

    int[] location = new int[2]; 
    tv.getLocationOnScreen(location); 
    Log.d("getlocationonscreen in onStart :", Integer.toString(location[0])+" "+Integer.toString(location[1])); 
    super.onStart(); 
} 

diseño xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" > 

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="156dp" 
    android:text="Medium Text" 
    android:textAppearance="?android:attr/textAppearanceMedium" /> 

</RelativeLayout> 

Una vez más, pido perdón por repetir la pregunta. Gracias por adelantado.

+0

Puede explicar un poco más cuál es su problema exacto. qué va mal en el código anterior –

Respuesta

13

Usted pone la 'medición' en el onWindowFocusChanged() -metodo.
Como los estados de documentación:

Este es el mejor indicador de si esta actividad es visible para el usuario.

También puede ponerlo en el onResume() que es el último paso antes de la aplicación es completamente en la pantalla y activa, sin embargo:

Tenga en cuenta que onResume no es el mejor indicador de que su actividad es visible para el usuario; una ventana del sistema como el bloqueo de teclas puede estar en frente. Use onWindowFocusChanged (boolean) para asegurarse de que su actividad sea visible para el usuario (por ejemplo, reanudar un juego).

Si la ventana/vista aún no se ha visualizado, no hay garantía de que tenga sus medidas, por lo que el método anterior sería mejor.

Cuestiones relacionadas