如何在两列之间均匀分割TableRow?

时间:2011-06-20 21:22:51

标签: android

我正在动态生成TableRows。对于每个TableRow,在一列中有一个TextView,在另一列中有一个EditText。如何生成行,使TextView占据行的一半而EditText占用另一半?

这就是我目前所拥有的:

布局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列变得太小而无法读取。

2 个答案:

答案 0 :(得分:13)

请注意,TableLayout扩展了LinearLayout(同样也是TableRow)。这意味着TableLayout中的所有子项以及TableRow中的所有子项都可以指定android:layout_weight属性以获取Phoenixblade9所描述的行为。只需在android:layout_weight="1"TextView上设置EditText,即可获得50%的分割。

答案 1 :(得分:6)

来自我的previous post

我不知道TableLayout是最好的方法,除非你显示大量数据并且需要使用它,否则它会很麻烦。

我发现确保表单对象按照我想要的方式分布长度的最佳方法之一是使用权重而不是明确声明宽度。

尝试以下方法:

<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,以确保视图看起来完全符合您的要求。

如果您愿意,可以将这些LinearLayouts放在TableLayout中:)

希望这有帮助。