2014-02-08 34 views
0

隨着我的Android應用程序不斷增加,我需要包含動態特性,包括增長/減少表格。
因此,我已經從定義的XML切換到編程方法。如何以編程方式讓佈局工作

我主要的XML,包含基本表的佈局如下:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:gravity="center" 
android:orientation="vertical" > 

    <TableLayout 
     android:id="@+id/table_layout_abonos" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="20dp" 
     android:gravity="top" > 

    </TableLayout> 
</LinearLayout> 

然後我嘗試使用一個包含藉助於每個錶行的一組標題的的TableRow定義表格的標題不同的TextView。
我已經實現了這個如下:

public void añadeCabeceraTablaAbonos() { 

    TableLayout layoutTablaAbonados = (TableLayout) findViewById(R.id.table_layout_abonos); 

    int rowHeight = getStandardPixels(40); 

    TableRowTitulos cabeceraTablaAbonados = new TableRowTitulos(this); 

    cabeceraTablaAbonados.setId(100); 

    /* 
    * android:id="@+id/cultivo_auxiliares" android:layout_width="400dp" 
    * android:layout_height="40dp" android:layout_marginLeft="40dp" 
    * android:gravity="center" 
    * android:text="@string/cultivo_parcela_auxiliar" 
    * android:textAppearance="?android:attr/textAppearanceMedium" 
    * 
    * <TableRow android:layout_marginBottom="10dp" 
    * android:background="@color/rojo_dupont" > 
    */ 

    TableLayout.LayoutParams tableRowParams = new TableLayout.LayoutParams(
      TableLayout.LayoutParams.MATCH_PARENT, 
      TableLayout.LayoutParams.WRAP_CONTENT); 

    tableRowParams.setMargins(0, 0, 0, getStandardPixels(10)); 

    cabeceraTablaAbonados.setLayoutParams(tableRowParams); 

    header_abonado_cultivo = new TextView(this); 
    header_abonado_abono = new TextView(this); 
    header_abonado_fecha = new TextView(this); 
    header_abonado_dosis = new TextView(this); 
    header_abonado_dosificacion = new TextView(this); 
    header_abonado_metodo = new TextView(this); 
    header_abonado_deposito_A = new TextView(this); 
    header_abonado_deposito_B = new TextView(this); 
    header_abonado_deposito_C = new TextView(this); 
    header_abonado_deposito_D = new TextView(this); 
    header_botonera = new TextView(this); 

    header_abonado_cultivo.setId(101); 
    header_abonado_cultivo.setText("CULTIVO"); 
    header_abonado_cultivo.setGravity(Gravity.CENTER); 
    header_abonado_cultivo 
      .setWidth(getStandardPixels(ANCHO_COLUMNA_CULTIVO_ABONO)); 
    //header_abonado_cultivo.setHeight(rowHeight); 
    header_abonado_cultivo.setTextAppearance(this, 
      android.R.style.TextAppearance_Medium); 

    header_abonado_abono.setId(102); 
    header_abonado_abono.setText("ABONO"); 
    header_abonado_abono.setGravity(Gravity.CENTER); 
    header_abonado_abono 
      .setWidth(getStandardPixels(ANCHO_COLUMNA_ABONO_ABONO)); 
    //header_abonado_abono.setHeight(rowHeight); 
    header_abonado_abono.setTextAppearance(this, 
      android.R.style.TextAppearance_Medium); 

    header_abonado_fecha.setId(103); 
    header_abonado_fecha.setText("FECHA"); 
    header_abonado_fecha.setGravity(Gravity.CENTER); 
    header_abonado_fecha 
      .setWidth(getStandardPixels(ANCHO_COLUMNA_FECHA_ABONO)); 
    //header_abonado_fecha.setHeight(rowHeight); 
    header_abonado_fecha.setTextAppearance(this, 
      android.R.style.TextAppearance_Medium); 

    header_abonado_metodo.setId(104); 
    header_abonado_metodo.setText("MÉTODO"); 
    header_abonado_metodo.setGravity(Gravity.CENTER); 
    header_abonado_metodo 
      .setWidth(getStandardPixels(ANCHO_COLUMNA_METODO_ABONO)); 
    //header_abonado_metodo.setHeight(rowHeight); 
    header_abonado_metodo.setTextAppearance(this, 
      android.R.style.TextAppearance_Medium); 

    header_abonado_dosis.setId(105); 
    header_abonado_dosis.setText("DÓSIS"); 
    header_abonado_dosis.setGravity(Gravity.CENTER); 
    header_abonado_dosis 
      .setWidth(getStandardPixels(ANCHO_COLUMNA_DOSIS_ABONO)); 
    //header_abonado_dosis.setHeight(rowHeight); 
    header_abonado_dosis.setTextAppearance(this, 
      android.R.style.TextAppearance_Medium); 

    header_abonado_dosificacion.setId(106); 
    header_abonado_dosificacion.setText("DOSIFICACIÓN"); 
    header_abonado_dosificacion.setGravity(Gravity.CENTER); 
    header_abonado_dosificacion 
      .setWidth(getStandardPixels(ANCHO_COLUMNA_DOSIFICACION_ABONO)); 
    //header_abonado_dosificacion.setHeight(rowHeight); 
    header_abonado_dosificacion.setTextAppearance(this, 
      android.R.style.TextAppearance_Medium); 

    header_abonado_deposito_A.setId(107); 
    header_abonado_deposito_A.setText("DEP. A"); 
    header_abonado_deposito_A.setGravity(Gravity.CENTER); 
    header_abonado_deposito_A 
      .setWidth(getStandardPixels(ANCHO_COLUMNA_DEPOSITO_ABONO)); 
    //header_abonado_deposito_A.setHeight(rowHeight); 
    header_abonado_deposito_A.setTextAppearance(this, 
      android.R.style.TextAppearance_Medium); 

    header_abonado_deposito_B.setId(108); 
    header_abonado_deposito_B.setText("DEP. B"); 
    header_abonado_deposito_B.setGravity(Gravity.CENTER); 
    header_abonado_deposito_B 
      .setWidth(getStandardPixels(ANCHO_COLUMNA_DEPOSITO_ABONO)); 
    //header_abonado_deposito_B.setHeight(rowHeight); 
    header_abonado_deposito_B.setTextAppearance(this, 
      android.R.style.TextAppearance_Medium); 

    header_abonado_deposito_C.setId(109); 
    header_abonado_deposito_C.setText("DEP. C"); 
    header_abonado_deposito_C.setGravity(Gravity.CENTER); 
    header_abonado_deposito_C 
      .setWidth(getStandardPixels(ANCHO_COLUMNA_DEPOSITO_ABONO)); 
    //header_abonado_deposito_C.setHeight(rowHeight); 
    header_abonado_deposito_C.setTextAppearance(this, 
      android.R.style.TextAppearance_Medium); 

    header_abonado_deposito_D.setId(110); 
    header_abonado_deposito_D.setText("DEP. D"); 
    header_abonado_deposito_D.setGravity(Gravity.CENTER); 
    header_abonado_deposito_D 
      .setWidth(getStandardPixels(ANCHO_COLUMNA_DEPOSITO_ABONO)); 
    //header_abonado_deposito_D.setHeight(rowHeight); 
    header_abonado_deposito_D.setTextAppearance(this, 
      android.R.style.TextAppearance_Medium); 

    header_botonera.setId(111); 
    header_botonera.setText(""); 
    header_botonera.setGravity(Gravity.CENTER); 
    //header_botonera 
    //  .setWidth(getStandardPixels(ANCHO_COLUMNA_BOTONERA_ABONO)); 
    //header_botonera.setHeight(rowHeight); 
    header_botonera.setTextAppearance(this, 
      android.R.style.TextAppearance_Medium); 

    cabeceraTablaAbonados.addView(header_abonado_cultivo); 
    cabeceraTablaAbonados.addView(header_abonado_abono); 
    cabeceraTablaAbonados.addView(header_abonado_fecha); 
    cabeceraTablaAbonados.addView(header_abonado_metodo); 
    cabeceraTablaAbonados.addView(header_abonado_dosis); 
    cabeceraTablaAbonados.addView(header_abonado_dosificacion); 
    cabeceraTablaAbonados.addView(header_abonado_deposito_A); 
    cabeceraTablaAbonados.addView(header_abonado_deposito_B); 
    cabeceraTablaAbonados.addView(header_abonado_deposito_C); 
    cabeceraTablaAbonados.addView(header_abonado_deposito_D); 
    cabeceraTablaAbonados.addView(header_botonera); 

    //abonadoLayout 

    layoutTablaAbonados.addView(cabeceraTablaAbonados); 

// TableRow.LayoutParams buttonParams = (TableRow.LayoutParams)header_abonado_cultivo.getLayoutParams(); 
// buttonParams.setMargins(15, 10, 10, 10); 
} 

不過,我不能做:

a)具有特定高度的頭。我曾嘗試更換:

TableLayout.LayoutParams tableRowParams = new TableLayout.LayoutParams(
     TableLayout.LayoutParams.MATCH_PARENT, 
     TableLayout.LayoutParams.WRAP_CONTENT); 

TableLayout.LayoutParams tableRowParams = new TableLayout.LayoutParams(
     TableLayout.LayoutParams.MATCH_PARENT, 
     100); // For 100 pixels height 

但該行仍然是「標準」的高度只是包裝的內容。

另外,我有一個類似的問題,由一系列按鈕組成的數據行(非標題)。
這些按鈕的文字會改變dinamically,並將垂直拉伸,以適應這樣的字符串。儘管如此,鄰居按鈕不會相應地拉伸,所以這個方面非常難看,一些按鈕比其他按鈕更高(我不會在這個貼上更多的代碼,因爲它與其他問題非常相似)。
下面是一個等價的XML,做它正確的(相應增大所有按鈕到一個更高的行上):

(FIRST TABLE ROW IS HEADER AND NEXT ARE DATA) 

      <ScrollView 
       android:id="@+id/tab6" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:fillViewport="true" > 

       <LinearLayout 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:gravity="center" 
        android:orientation="vertical" > 

        <TableLayout 
         android:layout_width="match_parent" 
         android:layout_height="wrap_content" 
         android:layout_marginTop="20dp" 
         android:gravity="top" > 

         <TableRow 
          android:layout_marginBottom="10dp" 
          android:background="@color/rojo_dupont" > 

          <TextView 
           android:id="@+id/cultivo_auxiliares" 
           android:layout_width="400dp" 
           android:layout_height="40dp" 
           android:layout_marginLeft="40dp" 
           android:gravity="center" 
           android:text="@string/cultivo_parcela_auxiliar" 
           android:textAppearance="?android:attr/textAppearanceMedium" /> 

          <TextView 
           android:id="@+id/nombre_plaga_label" 
           android:layout_width="120dp" 
           android:layout_height="wrap_content" 
           android:layout_marginLeft="40dp" 
           android:gravity="center" 
           android:text="@string/nombre_plaga_label" 
           android:textAppearance="?android:attr/textAppearanceMedium" /> 

          <TextView 
           android:id="@+id/nombre_insecto_label" 
           android:layout_width="120dp" 
           android:layout_height="wrap_content" 
           android:layout_marginLeft="40dp" 
           android:gravity="center" 
           android:text="@string/nombre_insecto_label" 
           android:textAppearance="?android:attr/textAppearanceMedium" /> 

          <TextView 
           android:id="@+id/fecha_suelta_label" 
           android:layout_width="120dp" 
           android:layout_height="40dp" 
           android:layout_marginLeft="40dp" 
           android:gravity="center" 
           android:text="@string/fecha_suelta_label" 
           android:textAppearance="?android:attr/textAppearanceMedium" /> 

          <TextView 
           android:id="@+id/cantidad_insecto_label" 
           android:layout_width="120dp" 
           android:layout_height="wrap_content" 
           android:layout_marginLeft="40dp" 
           android:gravity="center" 
           android:text="@string/cantidad_insecto_label" 
           android:textAppearance="?android:attr/textAppearanceMedium" /> 
         </TableRow> 

         <TableRow 
          android:layout_height="wrap_content" 
          android:layout_marginBottom="5dp" > 

          <Button 
           android:id="@+id/cultivo_parcela_0" 
           android:layout_width="150dp" 
           android:layout_height="match_parent" 
           android:layout_marginLeft="5dp" 
           android:gravity="center" 
           android:textAppearance="?android:attr/textAppearanceMedium" 
           android:textColor="#8ad5f0" /> 

          <Button 
           android:id="@+id/nombre_plaga_0" 
           android:layout_width="150dp" 
           android:layout_height="match_parent" 
           android:layout_marginLeft="5dp" 
           android:gravity="center" 
           android:textAppearance="?android:attr/textAppearanceMedium" 
           android:textColor="#8ad5f0" /> 

          <Button 
           android:id="@+id/nombre_insecto_0" 
           android:layout_width="180dp" 
           android:layout_height="match_parent" 
           android:layout_marginLeft="20dp" 
           android:focusableInTouchMode="false" 
           android:gravity="center" 
           android:hint="" /> 

          <Button 
           android:id="@+id/fecha_suelta_0" 
           android:layout_width="150dp" 
           android:layout_height="match_parent" 
           android:layout_marginLeft="5dp" 
           android:gravity="center" 
           android:textAppearance="?android:attr/textAppearanceMedium" 
           android:textColor="#8ad5f0" /> 

          <EditText 
           android:id="@+id/cantidad_insecto_0" 
           android:layout_width="120dp" 
           android:layout_height="match_parent" 
           android:layout_marginLeft="40dp" 
           android:focusableInTouchMode="false" 
           android:gravity="center" 
           android:hint="" 
           android:inputType="number" /> 

          <ImageButton 
           android:id="@+id/insecto_0_delete" 
           android:layout_width="wrap_content" 
           android:layout_height="match_parent" 
           android:layout_marginLeft="15dp" 
           android:contentDescription="@string/delete_content_description" 
           android:src="@drawable/discard_dark" /> 

          <ImageButton 
           android:id="@+id/insecto_0_comentario" 
           android:layout_width="wrap_content" 
           android:layout_height="match_parent" 
           android:layout_marginLeft="15dp" 
           android:contentDescription="@string/delete_content_description" 
           android:src="@drawable/ic_dialog_alert_holo_dark" /> 
         </TableRow> 

多個行具有相同的架構 FOLLOW ...

我想我我在佈局上做錯了事,但即使在閱讀了很多內容之後,我仍然無法弄清楚。
有人可以指導我這個或提供一些工作代碼?

在此先感謝,

何塞。

回答

1

好吧,看來我找到了解決方案!!主要的問題是我在行內爲視圖選擇了錯誤的佈局。

從概念上講,行的高度必須是WRAP_CONTENT,因此它將隨着它包含的最高視圖動態增長。此外,行中的每個View都必須將其放入MATCH_PARENT中,以便它們隨着行的增長而增長。這對我來說並不是非常直觀,但確實如此。

所以這裏是解決了這個問題,我的代碼的一部分,希望這可以幫助別人:

TableRowAbonados nuevaFila = new TableRowAbonados(this); 

    TableLayout.LayoutParams tableRowParams = new TableLayout.LayoutParams(
      TableLayout.LayoutParams.MATCH_PARENT, 
      TableLayout.LayoutParams.WRAP_CONTENT); 

    int leftMargin = 0; 
    int topMargin = 0; 
    int rightMargin = 0; 
    int bottomMargin = getStandardPixels(5); 

    tableRowParams.setMargins(leftMargin, topMargin, rightMargin, 
      bottomMargin); 

    nuevaFila.setLayoutParams(tableRowParams); 

    Button botonAbono = new Button(this); 
    Button botonFecha = new Button(this); 
    Button botonMetodo = new Button(this); 
    EditText celdaDosis = new EditText(this); 

    celdaDosis.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL); 

    nuevaFila.addView(botonAbono); 
    nuevaFila.addView(botonFecha); 
    nuevaFila.addView(botonMetodo); 
    nuevaFila.addView(celdaDosis); 

    botonAbono.getLayoutParams().height=TableRow.LayoutParams.MATCH_PARENT; 
    botonFecha.getLayoutParams().height=TableRow.LayoutParams.MATCH_PARENT; 
    botonMetodo.getLayoutParams().height=TableRow.LayoutParams.MATCH_PARENT; 
    celdaDosis.getLayoutParams().height=TableRow.LayoutParams.MATCH_PARENT; 

    layoutTablaAbonados.addView(nuevaFila); 
相關問題