2015-12-07 46 views
1

我正在嘗試以編程方式創建一個簡單的表。但是,當調用row2.addView時,代碼崩潰。與此錯誤:TableLayout - 指定的孩子已經有父母

Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 

這裏是我的代碼:

import android.graphics.Color; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.widget.TableLayout; 
import android.widget.TableRow; 
import android.widget.TextView; 


public class MainActivity extends AppCompatActivity { 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //setContentView(R.layout.contnt_2); 

     TableLayout tableLayout = new TableLayout(this); 

     TableRow.LayoutParams tableRowParams = new TableRow.LayoutParams(); 
     tableRowParams.setMargins(1, 1, 1, 1); 


     TableRow row1 = new TableRow(this); 
     TableRow row2 = new TableRow(this); 
     TableRow row3 = new TableRow(this); 

     TextView text1 = new TextView(this); 
     text1.setText("DDDDDDDDDDDDD"); 
     text1.setBackgroundColor(Color.GRAY); 

     TextView text2 = new TextView(this); 
     text2.setText("DDDDDDDDDDDDD"); 
     text2.setBackgroundColor(Color.GRAY); 

     TextView text3 = new TextView(this); 
     text3.setText("DDDDDDDDDDDDD"); 
     text3.setBackgroundColor(Color.GRAY); 

     row1.addView(text1, tableRowParams); 
     row1.addView(text2, tableRowParams); 
     row1.addView(text3, tableRowParams); 

     row2.addView(text1, tableRowParams); 
     row2.addView(text2, tableRowParams); 
     row2.addView(text3, tableRowParams); 

     row3.addView(text1, tableRowParams); 
     row3.addView(text2, tableRowParams); 
     row3.addView(text3, tableRowParams); 

     tableLayout.addView(row1); 
     tableLayout.addView(row2); 
     tableLayout.addView(row3); 

     setContentView(tableLayout); 

    } 

我無法找到一個理由爲什麼它會發生。如何正確地向表添加行?你能幫我嗎?

回答

1

這是因爲你創建了三個TextView S和它們添加到您的第一TableRow與此代碼:

row1.addView(text1, tableRowParams); 
row1.addView(text2, tableRowParams); 
row1.addView(text3, tableRowParams); 

然後設法補充說,你已經創建的第2行。

不能添加相同TextView多個TableRow S,因爲錯誤說,每個TextView只能有一個父同TextView

您需要爲EACH TableRow創建三個不同的TextView s。

-1

您的方法的主要問題:視圖不能是Android中多個父項的子項。

下面是關於如何以編程方式創建一個TableLayout的教程,也許你會得到一些想法改善你的邏輯: http://www.prandroid.com/2014/05/creating-table-layout-dynamically-in.html

我只是在情況下,它貼在這裏還有:

public class MainActivity extends Activity { 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    String[] row = { "ROW1", "ROW2", "Row3", "Row4", "Row 5", "Row 6", 
    "Row 7" }; 
     String[] column = { "COLUMN1", "COLUMN2", "COLUMN3", "COLUMN4", 
    "COLUMN5", "COLUMN6" }; 
    int rl=row.length; int cl=column.length; 

    Log.d("--", "R-Lenght--"+rl+" "+"C-Lenght--"+cl); 

    ScrollView sv = new ScrollView(this); 
    TableLayout tableLayout = createTableLayout(row, column,rl, cl); 
    HorizontalScrollView hsv = new HorizontalScrollView(this); 

    hsv.addView(tableLayout); 
    sv.addView(hsv); 
    setContentView(sv); 

} 

public void makeCellEmpty(TableLayout tableLayout, int rowIndex, int columnIndex) { 
    // get row from table with rowIndex 
    TableRow tableRow = (TableRow) tableLayout.getChildAt(rowIndex); 

    // get cell from row with columnIndex 
    TextView textView = (TextView)tableRow.getChildAt(columnIndex); 

    // make it black 
    textView.setBackgroundColor(Color.BLACK); 
} 
public void setHeaderTitle(TableLayout tableLayout, int rowIndex, int columnIndex){ 

    // get row from table with rowIndex 
    TableRow tableRow = (TableRow) tableLayout.getChildAt(rowIndex); 

    // get cell from row with columnIndex 
    TextView textView = (TextView)tableRow.getChildAt(columnIndex); 

    textView.setText("Hello"); 
} 

private TableLayout createTableLayout(String [] rv, String [] cv,int rowCount, int columnCount) { 
    // 1) Create a tableLayout and its params 
    TableLayout.LayoutParams tableLayoutParams = new TableLayout.LayoutParams(); 
    TableLayout tableLayout = new TableLayout(this); 
    tableLayout.setBackgroundColor(Color.BLACK); 

    // 2) create tableRow params 
    TableRow.LayoutParams tableRowParams = new TableRow.LayoutParams(); 
    tableRowParams.setMargins(1, 1, 1, 1); 
    tableRowParams.weight = 1; 

    for (int i = 0; i < rowCount; i++) { 
     // 3) create tableRow 
     TableRow tableRow = new TableRow(this); 
     tableRow.setBackgroundColor(Color.BLACK); 

     for (int j= 0; j < columnCount; j++) { 
      // 4) create textView 
      TextView textView = new TextView(this); 
      // textView.setText(String.valueOf(j)); 
      textView.setBackgroundColor(Color.WHITE); 
      textView.setGravity(Gravity.CENTER); 

      String s1 = Integer.toString(i); 
    String s2 = Integer.toString(j); 
    String s3 = s1 + s2; 
    int id = Integer.parseInt(s3); 
    Log.d("TAG", "-___>"+id); 
       if (i ==0 && j==0){ 
       textView.setText("0==0"); 
       } else if(i==0){ 
       Log.d("TAAG", "set Column Headers"); 
       textView.setText(cv[j-1]); 
       }else if(j==0){ 
       Log.d("TAAG", "Set Row Headers"); 
       textView.setText(rv[i-1]); 
       }else { 
       textView.setText(""+id); 
       // check id=23 
       if(id==23){ 
       textView.setText("ID=23"); 

       } 
       } 

      // 5) add textView to tableRow 
      tableRow.addView(textView, tableRowParams); 
     } 

     // 6) add tableRow to tableLayout 
     tableLayout.addView(tableRow, tableLayoutParams); 
    } 

    return tableLayout; 
} 
} 
相關問題