2016-01-13 118 views
0

基本上我想創建動態地創建與我插入的FrameLayout(容器)的水平和垂直定製分隔一個TableLayout功能。我可以很容易地做到這一點的XML,但我需要做的是,在運行時,主要是因爲我不知道有多大的表會是,也可能是很大的(要避免複製+粘貼代碼在XML多次)。如何創建在運行時動態TableLayout使用定製(水平和垂直)的分隔

這裏是我想究竟是什麼(壽靜態),但在XML:

<TableLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/unitsTableContainer" 
     android:layout_margin="30dp"> 

     <View style="@style/TableVerticalDivider"/> 

     <TableRow 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

      <View style="@style/TableHorizontalDivider"/> 

      <TextView style="@style/UnitTableDefaultText"/> 

      <View style="@style/TableHorizontalDivider"/> 

      <TextView style="@style/UnitTableDefaultText"/> 

      <View style="@style/TableHorizontalDivider"/> 

      <TextView style="@style/UnitTableDefaultText"/> 

      <View style="@style/TableHorizontalDivider"/> 

      <TextView style="@style/UnitTableDefaultText"/> 

      <View style="@style/TableHorizontalDivider"/> 

     </TableRow> 

     <View style="@style/TableVerticalDivider"/> 

     <TableRow 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

      <View style="@style/TableHorizontalDivider"/> 

      <TextView style="@style/UnitTableDefaultText"/> 

      <View style="@style/TableHorizontalDivider"/> 

      <TextView style="@style/UnitTableDefaultText"/> 

      <View style="@style/TableHorizontalDivider"/> 

      <TextView style="@style/UnitTableDefaultText"/> 

      <View style="@style/TableHorizontalDivider"/> 

      <TextView style="@style/UnitTableDefaultText"/> 

      <View style="@style/TableHorizontalDivider"/> 

     </TableRow> 

     <View style="@style/TableVerticalDivider"/> 

    </TableLayout> 

這裏是我的最好成績做它在運行時(動態):

private void createTable() { 
    TableLayout tableLayout; 
    View verticalTableColumnDivider; 
    View horizontalTableRowDivider; 
    TableRow tableRow; 
    TextView textView; 

    tableLayout = new TableLayout(getApplicationContext()); 
    tableLayout.setStretchAllColumns(true); 

    for (int currentRow = 0; currentRow < 2; currentRow++) { 
     tableRow = new TableRow(getApplicationContext()); 

     verticalTableColumnDivider = getLayoutInflater().inflate(R.layout.template_vertical_table_divider, null); 
     horizontalTableRowDivider = getLayoutInflater().inflate(R.layout.template_horizontal_table_divider, null); 
     tableRow.addView(horizontalTableRowDivider); 

     for (int currentColumn = 0; currentColumn < 4; currentColumn++) { 
      textView = (TextView) getLayoutInflater().inflate(R.layout.template_default_table_text, null); 
      tableRow.addView(textView); 

      horizontalTableRowDivider = getLayoutInflater().inflate(R.layout.template_horizontal_table_divider, null); 
      tableRow.addView(horizontalTableRowDivider); 
     } 
     tableLayout.addView(verticalTableColumnDivider); 
     tableLayout.addView(tableRow); 
    } 

    verticalTableColumnDivider = getLayoutInflater().inflate(R.layout.template_vertical_table_divider, null); 
    tableLayout.addView(verticalTableColumnDivider); 

    FrameLayout tableLayoutContainer = (FrameLayout) findViewById(R.id.unitsTableContainer); 
    tableLayoutContainer.addView(tableLayout); 
} 

這裏是模板他們的風格(當然風格在一個XML文件中,並且所有3個模板都是分開的佈局XML文件):

<View style="@style/TableHorizontalDivider"/> 

<style name="TableHorizontalDivider"> 
    <item name="android:layout_width">4dp</item> 
    <item name="android:layout_height">match_parent</item> 
    <item name="android:background">?android:attr/listDivider</item> 
    <item name="android:visibility">visible</item> 
</style> 

<View style="@style/TableVerticalDivider"/> 

<style name="TableVerticalDivider"> 
    <item name="android:layout_width">match_parent</item> 
    <item name="android:layout_height">4dp</item> 
    <item name="android:background">?android:attr/listDivider</item> 
    <item name="android:visibility">visible</item> 
</style> 

<TextView style="@style/UnitTableDefaultText"/> 

<style name="UnitTableDefaultText"> 
    <item name="android:textColor">#222222</item> 
    <item name="android:text">Test</item> 
    <item name="android:textSize">16sp</item> 
    <item name="android:gravity">center</item> 
    <item name="android:layout_gravity">center</item> 
    <item name="android:layout_weight">1</item> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:layout_width">0dp</item> 
</style> 

,這裏是結果,頂級表是動態地進行,底部的表是它應該看起來像,但靜態作出什麼:有把textViews到TableLayout,因爲你只能看到分隔的問題 result of my tries

沒有問題,行分隔是太細,柱分隔符(如果你仔細觀察),他們也太薄,堆疊在行分隔符,不知道爲什麼他們水平,而不是垂直繪製。所以如果有人知道分隔線爲什麼會出錯,或者有解決方法,請告訴我。

回答

0

OK,我發現瞭如何做到這一點。我讓你把你的文本內容的String [] []爲表一類,它在運行時創建表:

public class SimpleTextTableWithBorders extends TableLayout { 

private Context mContext; 
private String[][] mTableContent; 
private int mTextColor, mBorderColor; 
private int mTextViewBorderWidth, mTableBorderWidth; 

public SimpleTextTableWithBorders(Context context, String[][] tableContent) { 
    super(context); 
    mContext = context; 
    mTableContent = tableContent; 
    mTextColor = 0xff111111; 
    mBorderColor = 0xAA444444; 
    mTextViewBorderWidth = 4; 
    mTableBorderWidth = mTextViewBorderWidth * 2; 
    setupTable(); 
} 

private void setupTable() { 
    TableRow tableRow; 
    TextView textView; 

    setStretchAllColumns(true); 
    setBackground(borderDrawable(mTableBorderWidth)); 
    setPadding(mTableBorderWidth, mTableBorderWidth, mTableBorderWidth, mTableBorderWidth); 

    for (int currentRow = 0; currentRow < mTableContent.length; currentRow++) { 
     tableRow = new TableRow(mContext); 

     for (int currentColumn = 0; currentColumn < mTableContent[0].length; currentColumn++) { 
      textView = new TextView(mContext); 
      textView.setTextColor(mTextColor); 
      textView.setBackground(borderDrawable(mTextViewBorderWidth)); 
      textView.setText(mTableContent[currentRow][currentColumn]); 
      textView.setGravity(Gravity.CENTER); 
      textView.setPadding(0, 6, 0, 6); 
      tableRow.addView(textView); 
     } 
     addView(tableRow); 
    } 
} 

private GradientDrawable borderDrawable(int borderWidth) { 
    GradientDrawable shapeDrawable = new GradientDrawable(); 
    shapeDrawable.setStroke(borderWidth, mBorderColor); 
    return shapeDrawable; 
} 

}

什麼,我一直在尋找最關鍵的事情是相當很多GradientDrawable。沒有設置者和獲得者,但是如果有人需要,你可以用其他有用的方法把它放在那裏,並按照你的需要使用它。

以下是示例結果: enter image description here