Android TableLayout宽度

35

我有一个TableLayout,有两列,作为滚动视图的唯一子元素。第一列包含TextViews('labels'),第二列包含EditText/Spinner/DateWidget等控件('values')。尽管我已经为TableLayoutTableRow和所有控件(在“values”列中)指定了android:layout_width="fill_parent",但当用户在EditText中输入非常长的值时,'values'列会超出可见屏幕区域。

我该如何解决这个问题?

7个回答

60
你可能想使用权重来定义列的大小。因此,你需要将表格布局的高度设置为填充父元素,但是对于每一列,应将宽度设置为“0px”,并将其权重设置为所需跨度的百分比。假设你想让第一列占屏幕宽度的30%,则将其权重设置为“0.3”,将第二列设置为“0.7”。
尝试一下,看看是否可行。

这是最终解决我的唯一方法。还要注意的是,如果在TableLayout上设置了shrinkColumns或stretchColumns,则可能会对所有内容产生不利影响。 - user4903
2
这个回答对我来说不太清楚,您的意思是设置所有TableRow组的所有子项的权重吗?如果是这样,那使用TableLayout的意义是什么呢?为什么不直接使用LinearLayouts?我建议在导致问题的列上同时设置stretch和shrink。 - satur9nine

29

解决这个问题的实用方法是使用TableLayout中的stretchColumnsshrinkColumns属性。它们的值应该是从0开始的列索引。

例如,如果您有一个两列TableLayout并且:

  • 您希望第二列填充空白空间(拉伸),使得在大屏幕设备上整个父视图都适合TableLayout
  • 您希望第一列在小屏幕设备上缩小(以及其内容可能被包裹/省略号)

您将定义您的TableLayout如下:

<TableLayout
    android:id="@+id/my_table_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:stretchColumns="1"
    android:shrinkColumns="0" >
</TableLayout>

4
请注意,您可以同时拉伸和收缩列。在我的TextView列上这样做可以防止它超出屏幕大小,但也允许其填充可用空间。 - satur9nine

8

这对我起作用了...

tableLayout.setColumnShrinkable(1,true);

1
太棒了!第一个参数是列,第二个参数用于设置它可收缩!谢谢! - Paschalis
很好,这对我也起作用。我使用setColumnShrinkable和setColumnStretchable来控制表格的行为。 - Barrrettt

6
<TableLayout 
android:layout_height="fill_parent" 
android:layout_width="fill_parent"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp">
<TableRow 
android:layout_height="fill_parent"
android:layout_width="fill_parent">
<TextView 
android:layout_width="wrap_content"
android:text="Name " 
android:layout_height="fill_parent">
</TextView>
<EditText 
android:layout_width="0dp"
android:layout_weight="1"
android:hint="name"
android:layout_height="wrap_content" 
>
</EditText>
</TableRow>
</TableLayout>

这段代码可以帮助我将文本视图对齐到第一列,并使编辑文本填满父容器。


这种方法在单元格从一行到另一行需要不同大小时非常有帮助。 - Diesel

0

我在Android 2.2上使用EditText时遇到了类似的问题。在我的情况下,添加android:maxWidth="0sp"属性有所帮助。现在EditText字段以我想要的方式显示 - 因此它仍然与其他EditText字段具有相同的大小,但是当输入长文本时不会被调整大小。

这是我的EditText定义:

<EditText android:id="@+id/extra_edit"
       android:padding="3dip"
       android:inputType="textImeMultiLine"
       android:maxWidth="0sp"
       android:layout_width="fill_parent"
       />

EditText中的提示和值会变形 - 我只能看到第一个字母。有什么解决方法吗? - Sameer Segal
请注意,即使这是旧的:如果您使用的是0值,请考虑只使用0px。sp表示Android将对其应用缩放值,而0 * anything = 0。 - Joe Plante

0

试试这个,确保 android:singleLine="false"android:inputType="textMultiLine"

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:stretchColumns="1">
    <TableRow android:layout_height="wrap_content"
        android:layout_width="fill_parent">

        <TextView android:text="Label:" />
        <EditText android:id="@+id/entry" android:inputType="textMultiLine"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:singleLine="false" />
    </TableRow>
</TableLayout>

0

对我来说有效,希望这对你也有所帮助

我正在循环3次,因此会添加3行,下面附上图片

    TableRow tr = new TableRow(getActivity());
    tr.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT,2));
    tr.setGravity(Gravity.CENTER_VERTICAL);

    TextView labelText = new TextView(getActivity());

    labelText.setText(key + " ");
    labelText.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT,0.7f));
    labelText.setGravity(Gravity.LEFT);
    labelText.setTextSize(8);
    labelText.setPadding(5, 0, 5, 0);
    tr.addView(labelText);

    View seperatorView = new View(getActivity());
    seperatorView.setLayoutParams(new TableRow.LayoutParams(2, TableRow.LayoutParams.MATCH_PARENT));
    seperatorView.setBackgroundColor(getResources().getColor(R.color.radio_border_color));
    tr.addView(seperatorView);

    TextView valueText = new TextView(getActivity());
    valueText.setText(value);
    valueText.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1.3f));
    valueText.setGravity(Gravity.LEFT);
   
    valueText.setTextSize(8);
    
    valueText.setMinLines(1);
    valueText.setMaxLines(Integer.MAX_VALUE);
    valueText.setPadding(5, 0, 5, 0);
    tr.addView(valueText);

    barcodeTableLayout.addView(tr);
   

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接