programacion - Problemas de formato de diseño de tabla de Android
manual de programacion android pdf (9)
No puedo hacer que mi TableLayout se ajuste dentro de la pantalla when the text cell is large
, a pesar de que el texto se ajusta inside the cell
.
Este es mi TableLayout. Una tabla simple de dos filas, dos columnas. Las celdas de la columna izquierda son multiline
. Si el texto de una de estas celdas es lo suficientemente grande como para dividirse en dos líneas, la columna se estira para llenar toda la pantalla y las columnas de la derecha se sacan de la pantalla.
¿Por qué? ¿Cómo puedo obligar a la mesa completa a permanecer dentro de la pantalla? Cualquier sugerencia es bienvenida.
Mi TableLayout es el siguiente:
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myTableLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TableRow>
<TextView
android:text="Account 4 with a very large name to see if it breaks on two or more lines"
android:singleLine="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
</TextView>
<TextView
android:text="$400.00"
android:gravity="right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
</TextView>
</TableRow>
<TableRow>
<TextView
android:text="Account 5"
android:singleLine="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
</TextView>
<TextView
android:text="$400.00"
android:gravity="right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
</TextView>
</TableRow>
</TableLayout>
El código para mostrar el diseño es básico:
public class AccountBrowserTest
extends Activity
{
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.setContentView(R.layout.accountbrowser_test);
}
}
Agregue android: stretchColumns
y android:shrinkColumns
al elemento TableLayout
:
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:stretchColumns="1"
android:shrinkColumns="1">
Los valores 1
son las columnas en las que desea que se produzcan los cambios. Puede especificar más de un valor como este:
android:stretchColumns="0,1"
o si quieres que los cambios ocurran en todas tus columnas como esta:
android:stretchColumns="*"
Consulte aquí para obtener información detallada: http://android-pro.blogspot.com/2010/02/table-layout.html
Descargo de responsabilidad: no soy muy bueno con los diseños, así que solo jugué un poco con algunos valores, y esto pareció funcionar (aunque no puedo dar una buena explicación de por qué):
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myTableLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TableRow>
<TextView
android:text="Account 4 with a very large name to see if it breaks on two or more lines"
android:singleLine="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
<TextView
android:text="$400.00"
android:gravity="right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.001"
/>
</TableRow>
<TableRow>
<TextView
android:text="Account 5"
android:singleLine="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
<TextView
android:text="$400.00"
android:gravity="right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.001"
/>
</TableRow>
</TableLayout>
También tenga en cuenta que no he probado este diseño en una actividad, solo lo vi en la vista de diseño del editor xml, pero al menos se veía bien allí.
Espero que este código te ayude ... clase pública MainActivity extiende Actividad {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:singleLine="false"
android:text="Account 4 with a very large /n name to see if it breaks /n on two or more lines" >
</TextView>
<TextView
android:id="@+id/tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:text="$400.00" >
</TextView>
</TableRow>
Hay una solución temporal, hacer:
android:stretchColumns = " (number of actual col) - 1 "
Aquí no funcionó ninguna solución en mi caso.
Puede que tenga que ver con el wrap_content
para el ancho de sus celdas multilínea.
Puedes probar algunas formas de darle un ancho más explícito ... es decir, establecer el width to 0
y dar a todas las celdas una layout_gravity = 1
. Eso debería hacer que cada una de las columnas ocupe una cantidad igual de ancho (o puede ajustar si desea que una tenga más peso que la otra).
También puede intentar manipular stretchColumns y / o shrinkColumns en TableLayout.
Tuve el mismo problema con mi aplicación y encontré la siguiente solución:
<TableLayout
android:shrinkColumns="0"
android:stretchColumns="1"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</TableLayout>
Esto funciona bien con 2 columnas.
Tuve el mismo problema y lo resolví agregando
android:stretchColumns="0"
al elemento TableLayout y configuración
android:layout_width="0dp"
en el TextView que era demasiado largo.
en el diseño de la tabla, use la propiedad shrinkColumns para las columnas que desea que puedan encoger para el ajuste
La forma más fácil es:
<TableLayout
android:shrinkColumns="*"/>
para reducir todas las columnas o puede escribir en lugar de "*", los índices de columnas que desea reducir, que en su caso serán
<TableLayout
android:shrinkColumns="0,1"/>
tenga en cuenta que los índices de columna comienzan desde cero, por lo que el último código permite que las columnas primera (índice = 0) y segunda (índice = 1) se reduzcan.