【问题标题】:How do I split a TableRow evenly between both columns?如何在两列之间平均拆分 TableRow?
【发布时间】:2011-06-21 13:02:55
【问题描述】:

我正在动态生成 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 列变得太小而无法阅读。

【问题讨论】:

    标签: android


    【解决方案1】:

    请注意,TableLayout 扩展了 LinearLayoutTableRow 也是如此)。这意味着TableLayout 中的任何孩子,以及TableRow 中的任何孩子,都可以指定android:layout_weight 属性来获取Phoenixblade9 描述的行为。只需在TextViewEditText 上设置android:layout_weight="1",您将获得50% 的拆分。

    【讨论】:

    • 有助于了解,但它没有按我预期的那样工作。这是我的revised code(修订在populateMap()(定义EditText行为)和addTableRow()(定义TextViewTableRow行为))。我所做的唯一其他更改是从 xml 文件中删除 android:stretch_columns="*" 行。列的行为还没有改变,TextViews 仍然占据了一半以上的空间。
    • 次要更新:我一直在隔离的 xml 布局文件中尝试您的方法。当只有TableRowTextViewEditText 时,一切正常。但是一旦将TableRow 放入TableLayout 中,偶数列的大小就无法保持,这又回到了我原来的问题。 (TL;DR - 它适用于单个 TableRow,但不适用于 TableLayout 中的 TableRow
    • 不幸的是,我似乎无法抗拒"width of a column is defined by the row with the widest cell in that column." 我正在诉诸将TableRows 添加到单个LinearLayout 的事实,因为我想要固定宽度的列,这在我的情况下会起作用。
    【解决方案2】:

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

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

    希望这会有所帮助。

    【讨论】:

    • 权重加起来是100,还是只是一个比例?我认为将两个权重设为 1 也会给你一个 50/50 的分割,或者如果你将一个权重设为 1,另一个权重设为 2,你将首先占据屏幕的 1/3,而另一个2/3。我不记得了,但很容易凭经验确定。
    • 所以,我的应用程序可能需要显示大量数据。我忘了在我原来的帖子中提到我用 ScrollView 包装了 TableLayout。但是,我将考虑使用带有 TextView 和 EditText 的单列表,尽管我认为这会违背 TableLayout 的目的。
    • @Lawngnomehitman:比例大于百分比。见this link for more information。简而言之,layout_weight 指定了一个视图相对于其他视图的“重要性”,因此它不必加起来为 100。如果未设置,则默认为 0。
    • 也许我弄错了,但确保它加起来是一个特定的数字并不是一个糟糕的设计策略:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-21
    相关资源
    最近更新 更多