如何将TableLayout列缩小到minWidth?

时间:2015-01-14 09:01:07

标签: android tablelayout

如果coloumn 3有大文本,则第2列消失。如果我设置android:stretchColumns="2,3",第2列也会消失。我想将minWidth设置为第2列。但是这个属性会被忽略。

我现在通过设置android:stretchColumns="3"android:shrinkColumns="3"并将maxWidth应用于位置2上的TextView来帮助自己。这几乎可以完成工作,但是minWidth会更多溶液

            <TableLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:shrinkColumns="2,3"
                android:stretchColumns="3" >

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

                    <TextView
                        android:id="@+id/TextViewIdLabel"
                        style="@style/overlay_content"
                        android:text="@string/id_label"
                        android:textStyle="bold" />

                    <TextView
                        android:id="@+id/TextViewIdValue"
                        style="@style/overlay_content"
                        android:layout_marginLeft="4dp" />

                    <TextView
                        android:id="@+id/TextViewPersonIdLabel"
                        style="@style/overlay_content"
                        android:layout_marginLeft="8dp"
                        android:text="@string/person_id_label"
                        android:textStyle="bold" />

                    <TextView
                        android:id="@+id/TextViewPersonIdValue"
                        style="@style/overlay_content"
                        android:layout_marginLeft="4dp" />
                </TableRow>
                <!-- I skipped the other rows -->
           </TableLayout>

如果你想知道这是用过的风格:

<style name="overlay_content">
    <item name="android:textColor">@color/foreground_color_on_dark_background</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:textSize">20sp</item>
    <item name="android:ellipsize">marquee</item>
    <item name="android:singleLine">true</item>
</style>

更新

随着答案的出现,我发现了更多关于我的要求的内容,我在此评论中总结了这些要求:How to shrink a TableLayout column to a minWidth?

3 个答案:

答案 0 :(得分:2)

  

如何将TableLayout列缩小为minWidth?

Actually it is simple, just TextView layout_width="wrap_content" can do
that, the reason not working in your style is that 'wrap_content' should
not work together with TextView 'ellipsize', they are conflict. So you need
one seperate syle 'overlay_slide' for the column that has long text.

So use 'overlay_content' for columns those have short text, use    
'overlay_slide' for columns that have long text.

Besides I suppose the 'ellipsize' in your style is not working because
seems two items missing:

    <item name="android:focusable">true</item>
    <item name="android:focusableInTouchMode">true</item>

finally in the column that has long text, you also need:

    android:layout_weight="1"

to use all rest of space for 'ellipsize'. 


  

android:shrinkColumns="2,3" android:stretchColumns="3"

中删除TableLayout


  

解决方案工作方式和布局:

//remove 'ecllipze' related items from 'overlay_content' 
<style name="overlay_content">
   <item name="android:textColor">@color/foreground_color_on_dark_background</item>
   <item name="android:layout_width">wrap_content</item>
   <item name="android:layout_height">wrap_content</item>
   <item name="android:textSize">20sp</item>    
</style>

//remove 'android:layout_width' from 'overlay_slide'
<style name="overlay_slide">
   <item name="android:textColor">@color/foreground_color_on_dark_background</item>
   <item name="android:layout_height">wrap_content</item>
   <item name="android:textSize">20sp</item>
   <item name="android:ellipsize">marquee</item>

   <item name="android:focusable">true</item>
   <item name="android:focusableInTouchMode">true</item>

   <item name="android:singleLine">true</item>
</style>


<TableLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"

 >

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

      <TextView
           android:id="@+id/TextViewIdLabel"
           style="@style/overlay_content"              
           android:text="@string/id_label"
           android:textStyle="bold" />

      <TextView
           android:id="@+id/TextViewIdValue" 
           style="@style/overlay_content"
           android:layout_marginLeft="4dp"/>

      <TextView
           android:id="@+id/TextViewPersonIdLabel"
           style="@style/overlay_content"
           android:layout_marginLeft="8dp"
           android:text="@string/person_id_label"
           android:textStyle="bold"/>

      <TextView
           android:id="@+id/TextViewPersonIdValue"
           style="@style/overlay_slide"
           android:layout_weight="1" 
           android:layout_marginLeft="4dp" />  

   </TableRow>
</TableLayout>


  

我的测试截图:(人像与风景)

My test long text column is text 'Column 1 ... Column 8'

In Portrait In landscape

答案 1 :(得分:2)

这似乎可能是您需要的实用解决方法,因此请将评论移至答案。也许这可以改进,基本上是关于设置这些权重以适合您的应用程序

如何设置每列的权重而不是android:shrinkColumnsandroid:stretchColumns。因此,对于第1列,您可以设置0.2重量,第2列为0.3,第3列为0.5,依此类推

答案 2 :(得分:0)

您不能以这种方式更改列的宽度。宽度仅由该列中最宽的行定义。如果那里没有显示,则没有宽度。您可以通过调整该行的textview来调整此值。

<TextView
            android:id="@+id/TextViewIdValue"
            style="@style/overlay_content"
            android:layout_marginLeft="4dp"
            android:minEms="4"              <!--    You can use either of these -->
            android:minWidth="40dp" />

这里的权衡是你可能会用完房间,而其他专栏也会用完,但你可以调整你的文字大小来纠正它,即使你必须用{{1}覆盖你的风格}

这段代码似乎对我有用,但我也改变了你的TableLayout宽度来自&#34; 0dp&#34; to&#34; match_parent&#34;。

android:textSize="10dp"