2011-06-03 39 views
0

我的應用程序中有一個TableLayout,我需要以編程方式定義和添加TableLayout,因爲它建立在SQL查詢的輸出上。基本上,結果應該與時間表類似(一週內每天7列,每天不同時間段多行)。對於單元/時隙,我只需要具有特定背景顏色的普通視圖。以編程方式在TableLayout/TableRow中添加視圖的高度和寬度爲0

問題是,所有視圖的高度和寬度都是0,儘管如此。我究竟做錯了什麼?

代碼:

RelativeLayout.LayoutParams tableLayout = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); 
tableLayout.addRule(RelativeLayout.BELOW, R.id.myOtherLayout); 
tableLayout.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE); 

TableLayout table = new TableLayout(this); 
table.setBackgroundColor(Color.WHITE); 
table.setMinimumHeight(PixelConverter.pxToSp(this, 240)); 

// get availability table data 
int[][] tableData = getTableData(...); 

if (availability != null) { 
    // init array of tablerows, which represent one line each for every timeslot 
    for (int timeSlot = 0; timeSlot < 12; h++) { 
     // init row 
     TableRow newRow = new TableRow(this); 
     newRow.setLayoutParams(new LinearLayout.LayoutParams(
      LayoutParams.FILL_PARENT, // width 
      10)); // height 
     newRow.setMinimumHeight(10); 

     // create 7 views in each row - one for each day in a week 
     for (int day = 0; day < 7; d++) { 
      View v = new View(this); 
      v.setLayoutParams(new LinearLayout.LayoutParams(
       10, // TODO width 
       10)); // height 
      v.setMinimumWidth(10); 
      v.setMinimumHeight(10); 

      int cellHue = tableData[day][timeSlot]; 
      if (cellHue >= 0) { 
       v.setBackgroundColor(Color.HSVToColor(new float[] { cellHue, 100, 100 })); 
      } else { 
       v.setBackgroundColor(Color.TRANSPARENT); 
      } 

      // add view to tablerow 
      newRow.addView(v, day); 
     } 

     table.addView(newRow, timeSlot); 
    }  
} 

table.setId(R.id.my_table_id); 
mainLayout.addView(table, tableLayout); 

回答

2

我遇到了類似的問題 - 這個問題似乎與您的充氣意見後,使用LayoutParams類型的選擇。特別是,下面可能是你的問題的根源:

View v = new View(this); 
     v.setLayoutParams(new LinearLayout.LayoutParams(
      10, // TODO width 
      10)); // height 

我建議你試試:

View v = new View(this); 
     v.setLayoutParams(new TableRow.LayoutParams(
      10, // TODO width 
      10)); // height 

的關鍵是,你顯然應該指定類型父視圖的當使用LayoutParams時,而不是您設置的視圖的類型。請注意,在這種情況下,您也可能需要在您的行上調用setLayoutParams時指定TableLayout.LayoutParams

我不知道如何有據可查的,這是 - 我注意到它提到的我已經找到了一個任意博客(失去現在的聯繫,唉),我還沒有機會回去官方機制的文檔還,但大概是在那裏... :)

希望這會有所幫助!

+0

是的,瀏覽了一下LInearLayout的文檔:「設置與這個視圖相關的佈局參數,這些參數提供給這個視圖的** parent **,指定應該如何排列它ViewGroup.LayoutParams的許多子類,並且這些對應於ViewGroup的不同子類,負責安排他們的子女。「 – mpd106 2011-07-19 07:13:29

+0

是的,工作 - 謝謝馬特!實際上它以不同的方式解決了這個問題,但我可以發誓我看到一個官方Google教程採用了「錯誤的」LayoutParams(因此認爲它們或多或少是可互換的)。 – benfwirtz 2011-07-19 11:24:43

+0

是的,我對Android非常陌生,而且我看到很多例子都是關於使用錯誤的LayoutParams的。啊,最後到達那裏:) – mpd106 2011-07-20 07:25:34

相關問題