2011-06-20 25 views
3

我正在動態生成TableRows。對於每個TableRow,一列中有一個TextView,另一列中有一個EditText。我如何生成這樣的行,使TextView佔用一半的行,EditText佔據另一半?如何在兩列之間均勻分割TableRow?

這是我目前有:

佈局XML文件

<TableLayout android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:stretchColumns="*" 
     android:id="@+id/formTable" /> 

的Java源文件

private TreeMap<String, EditText> textData; 
... 
protected void onCreate(Bundle savedInstanceState) { 
    ... 
    textData = populateMap(); 
    ... 
    TableLayout table = (TableLayout) findViewById(R.id.formTable); 
    configureTableLayout(table,textData); 
} 

private TreeMap<String, EditText> populateMap() { 
    TreeMap<String, EditText> map = new TreeMap<String, EditText>(); 

    Set<String> dataTypeSet = app.getWorkingDataTypeList(); 
    for (String dataTypeKey : dataTypeSet) { 
     EditText edit = new EditText(this); 
     edit.setLayoutParams(new ViewGroup.LayoutParams(
       ViewGroup.LayoutParams.FILL_PARENT, 
       ViewGroup.LayoutParams.WRAP_CONTENT)); 
     edit.setText("0"); 
     edit.setHorizontallyScrolling(true); 
     map.put(dataTypeKey, edit); 
    } 

    return map; 
} 

private void configureTableLayout (TableLayout table, 
     Map<String, ? extends View> input) { 
    for (Map.Entry<String, ? extends View> entry : input.entrySet()) { 
     addTableRow(table, entry.getKey(), entry.getValue()); 
    } 
} 

private void addTableRow(TableLayout table, String dataTypeKey, View v) { 
    TableRow row = new TableRow(this); 
    row.setLayoutParams(new TableRow.LayoutParams(
      TableRow.LayoutParams.FILL_PARENT, 
      TableRow.LayoutParams.WRAP_CONTENT)); 

    TextView textCol = new TextView(this); // left column 
    textCol.setText(app.getTypeNameForKey(dataTypeKey)); 
    textCol.setLayoutParams(new TableRow.LayoutParams(
      TableRow.LayoutParams.FILL_PARENT, 
      TableRow.LayoutParams.FILL_PARENT)); 
    textCol.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16); 
    textCol.setHorizontallyScrolling(true); 

    // right column 
    TableRow.LayoutParams params = new TableRow.LayoutParams(
      TableRow.LayoutParams.FILL_PARENT, 
      TableRow.LayoutParams.WRAP_CONTENT); 
    params.column = 1; 
    v.setLayoutParams(params); 

    row.addView(textCol); 
    row.addView(v); 

    table.addView(row); 
} 

我已閱讀this post了,但它不完全是我尋找。我平均分割每一行的主要動機是,如果app.getTypeNameForKey(dataTypeKey)(位於addTableRow()中)的字符串之一過長,則可能會導致EditText列變得太小而不易讀。

回答

12

請注意,TableLayout延伸LinearLayout(同樣也是TableRow)。這意味着TableLayout中的任何子女以及TableRow中的任何子女都可以指定android:layout_weight屬性以獲取Phoenixblade9所描述的行爲。只需在TextViewEditText上設置android:layout_weight="1",即可獲得50%的分割。

+0

有助於知道,但它不工作,如我所料。這裏是我的[修改後的代碼](http://www.pastie.org/2103086)(修訂在'populateMap()'(它定義了'EditText'行爲)和'addTableRow()'(它定義了'TextView'和' TableRow'行爲))。我做的唯一的其他更改是從xml文件中刪除'android:stretch_columns =「*」'行。列的行爲還沒有改變,並且TextView仍佔用了一半以上的空間。 – kibibyte

+0

微小更新:我一直在孤立的xml佈局文件中嘗試你的方法。當只有一個帶有「TextView」和「EditText」的「TableRow」時,所有東西都可以工作。但是,一旦將'TableRow'放置在'TableLayout'中,偶數列大小將無法保持,恢復原來的問題。 (TL; DR-它在單個TableRow中工作,但不在TableLayout中的TableRow中) – kibibyte

+0

不幸的是,我似乎無法抗衡[[列的寬度是由具有該列中最寬的單元格的行定義。「](http://developer.android.com/reference/android/widget/TableLayout.html)我正在訴諸將TableRows添加到單個LinearLayout,該工作將在我的情況,因爲我想要固定寬度的列。 – kibibyte

6

從我previous post

我不知道,一個TableLayout是做到這一點的最佳方式,它可以除非你顯示大量數據,並且需要使用它很麻煩。

我發現確保表單對象的長度按照我希望的方式分佈的最佳方式之一是使用weight而不是顯式聲明寬度。

嘗試以下操作:

<LinearLayout ... android:orientation="horizontal" ... 
android:layout_width="match_parent" android:layout_height="wrap_content" 
<TextView ... android:layout_width="0dp" ... android:layout_weight="50" /> 
<TextView ... android:layout_width="0dp" ... android:layout_weight="50" /> 
</LinearLayout> 

確保申報佈局寬度爲0,這會讓佈局填寫的重量。

這應該在屏幕上相互鄰接創建兩個TextView,它們都填充屏幕的50%。你可以玩不同的百分比。您還可以使用LinearLayout作爲佔位符,並佔用您希望放置的任何%的權重。

確保您的「重量」合計爲100,以確保視圖看起來完全符合您的要求。

你可以把一個TableLayout這些LinearLayouts如果你想:)

希望這有助於。

+1

權重是否需要合計爲100,還是隻是一個比例?我認爲在1時加權也會給你50/50的分割,或者如果你在1加權一個,另一個加權爲2,你將有第一個佔據屏幕的三分之一,另一個2 /三分之二。我不記得,但這是可以憑經驗確定的事情。 – Travis

+0

因此,我的應用程序可能需要顯示大量的數據。我忘了在我的原帖中提到我用ScrollView包裝了TableLayout。但是,我將研究使用帶有TextView和EditText的單列表格,但我認爲這將破壞TableLayout的目的。 – kibibyte

+1

@Lawngnomehitman:比例比例更高。請參閱[此鏈接瞭解更多信息](http://developer.android.com/guide/topics/ui/layout-objects.html#linearlayout)。簡而言之,layout_weight指定視圖相對於其他視圖的「重要性」,所以它不必加起來最多爲100.如果未設置,則默認爲0. – kibibyte