2012-03-23 17 views
6

I tienen un diseño con 3 fragmentos:Android llegar Fragmento anchura

<LinearLayout android:id="@+id/acciones" 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="horizontal"> 

<LinearLayout 
android:id="@+id/fragment1" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_weight="1"> 

</LinearLayout> 


<LinearLayout 
android:id="@+id/fragment2" 
android:orientation="vertical" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_weight="1"> 

</LinearLayout> 

<LinearLayout 
android:orientation="vertical" 
android:id="@+id/f3" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_weight="1"> 

</LinearLayout> 

</LinearLayout> 

En el primer fragmento Tengo un TableLayout en el que tengo una TextView personalizado en cada fila. Quiero saber el ancho del fragmento porque si el TextView personalizado es más ancho que el fragmento, estableceré el número de líneas necesarias.

Esto es lo que he hecho en mi Vista de Texto personalizado:

@Override 
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) { 
super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

mMaxWidth = (float) (getMeasuredWidth()); 
} 

Con esta línea me dieron el ancho de los tres fragmentos, no sólo la que contiene la Vista de Texto personalizado.

Gracias.

Respuesta

25

Debería poder establecer el ancho de la Vista de texto para ser fill_parent, en cuyo caso hará la envoltura por usted. No debe establecer el ancho de sus diseños como match_parent, ya que es ineficiente cuando usa pesos de diseño.

Desde sistema de diseño de androide es ocasionalmente misteriosa en lo que respecta a ver tamaños, si el ajuste de la anchura de Vista de Texto que se fill_parent realidad hace que ocupa toda la pantalla (como su cuestión parece estar dando a entender) haga lo siguiente:

Establezca su ancho TextView a 0 de forma predeterminada. En onCreate de su actividad, después de ajustar la vista de contenido:

findViewById(R.id.acciones).getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     final int fragmentWidth = findViewById(R.id.releventFragmentId).getWidth(); 
     if (fragmentWidth != 0){ 
      findViewById(R.id.yourTextViewId).getLayoutParams().width = fragmentWidth; 
     } 
    } 
}); 

Al establecer el ancho de la Vista de Texto a 0 inicialmente, se impide que se cambien las anchuras de los fragmentos. Luego puede usar un observador de árbol de vista para obtener el ancho del fragmento que le interesa (al observar su vista raíz) después de que se haya realizado el diseño. Finalmente puede configurar su TextView para que tenga el ancho exacto, lo que a su vez lo hará automáticamente.

Tenga en cuenta que onGlobalLayout se puede llamar varias veces y se llama regularmente antes de que todas las vistas se hayan distribuido por completo, de ahí la comprobación! = 0. También es probable que desee hacer algún tipo de comprobación para asegurarse de que solo establece el ancho de la vista de texto una vez, o de lo contrario puede entrar en un bucle de diseño infinito (no el fin del mundo, pero no es bueno para el rendimiento) .

+0

Fantastic touch Monkeyless !. Ha funcionado perfectamente. Pasé tanto tiempo buscando la solución de mi pregunta. Muchas gracias. ¡Gran conocimiento !. – gutiory

+0

+1 buena respuesta. – Dharmendra

+0

He agregado este oyente y me da el ancho y la altura de mi fragmento, pero no dibuja mi contenido en la pantalla, por lo que puede ayudar con este problema –

Cuestiones relacionadas