防止布局溢出超过屏幕尺寸

问题描述 投票:0回答:3

我的片段中有一个 GridLayout,有 3 列和 2 行。第一个单元格中的文本长度有所不同。我将第一个单元格内的 TextView 设置为 maxLines=1 和 ellipsize=end。

我的问题是,每当文本达到一定长度时,与其相邻的第二个单元格就会溢出屏幕。我假设设置 GridLayout layout_width=match_parent 将使网格保持在屏幕尺寸内,并且单元格 1 中的 TextView 会缩小 - 将单元格 2 保持在屏幕内。

我的目标是保持单元格 2 可见,并使单元格 1 居中并填充剩余区域。

我尝试了这里建议的解决方案:https://stackoverflow.com/a/34099239/6368401 推荐:

您需要使用填充layout_gravity并设置任意layout_width 或需要椭圆化的长 TextView 的宽度。

android:layout_gravity="fill" android:layout_width="1dp"

我也尝试过玩

android:layout_weight
android:layout_gravity="fill_horizontal"
。此时,只要 cell2 保持可见,文本居中是可选的(不是首选)。两个单元格的宽度均为 50% 是行不通的,因为单元格 2 永远不会超过 4 个字符,通常为 2-3 个字符。

以下显示了布局的直观表示:

-------------------------
|     cell1     |       |
----------------| cell2 |
| cell3 | cell4 |       |
-------------------------

cell1 设置为 columnspan=2。 cell2 设置为 rowspan=2。所有单元格都是 TextView。

这是我在片段中的 XML:

<GridLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:columnCount="3"
        android:rowCount="2">

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_columnSpan="2">

            <TextView
                android:id="@+id/main_id"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginLeft="16dp"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:visibility="gone"/>

            <TextView
                android:id="@+id/description"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginLeft="16dp"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:visibility="visible"
                android:maxLines="1"
                android:ellipsize="end"
                android:singleLine="true"/>

            <TextView
                android:id="@+id/data"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginLeft="16dp"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:visibility="gone"
                android:textColor="@android:color/holo_green_light"/>

        </LinearLayout>


        <TextView
            android:id="@+id/percent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:textStyle="bold"
            android:layout_rowSpan="2"/>


        <TextView
            android:id="@+id/count"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="left"
            android:layout_marginLeft="16dp"
            android:textAppearance="?android:attr/textAppearanceMedium"/>


        <TextView
            android:id="@+id/date"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:textAppearance="?android:attr/textAppearanceMedium"/>


    </GridLayout>
android android-layout android-fragments
3个回答
1
投票

尝试各种组合,包括布局宽度、布局重力和重力,我偶然发现了一个对我有用的组合。

这是生成我正在搜索的布局的 XML:

<GridLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:columnCount="3"
        android:rowCount="2">

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="1dp"
            android:layout_height="wrap_content"
            android:layout_gravity="fill"
            android:layout_columnSpan="2"
            android:layout_weight="0">

            <TextView
                android:id="@+id/main_id"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginLeft="16dp"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:visibility="gone"/>

            <TextView
                android:id="@+id/description"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginLeft="16dp"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:visibility="visible"
                android:maxLines="1"
                android:ellipsize="end"
                android:layout_weight="1"
                android:gravity="center"/>

            <TextView
                android:id="@+id/data"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginLeft="16dp"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:visibility="gone"
                android:maxLines="1"
                android:ellipsize="end"
                android:layout_weight="1"
                android:gravity="center"
                android:textColor="@android:color/holo_green_light"/>

        </LinearLayout>


        <TextView
            android:id="@+id/percent"
            android:layout_width="30dp"
            android:minEms="3"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:textStyle="bold"
            android:layout_rowSpan="2"
            android:gravity="right"
            android:layout_marginLeft="16dp"/>


        <TextView
            android:id="@+id/count"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="left"
            android:layout_marginLeft="16dp"
            android:textAppearance="?android:attr/textAppearanceMedium"/>


        <TextView
            android:id="@+id/date"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:textAppearance="?android:attr/textAppearanceMedium"/>


    </GridLayout>

1
投票

有时,为占据整个屏幕宽度的视图设置

android:layout_width="match_parent"
android:layout_weight="1"
并将另一个视图从屏幕上移开,可以解决这个问题。因此,请尝试对包含 cell1、cell3、cell4 的 LinearLayout 执行此操作。

您还可以使用 LinearLayout 代替 GridLayout (您可以设置最适合您的视图的重力值):

<LinearLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1">

        <!-- Cell 1. --> 
        <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content" />

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <!-- Cell 3. -->
            <TextView
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content" />

            <!-- Cell 4. -->
            <TextView
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content" />

        </LinearLayout>

    </LinearLayout>

    <!-- Cell 2. -->
    <TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

0
投票

我这样解决了TextView尺寸过大的问题:

  1. 为 TextView 设置 android:layout_gravity="fill_horizontal"

  2. 将此代码添加到您的 Activity 或片段中:

    @覆盖 受保护无效 onStart() { super.onStart();

     int w = tv.getWidth();
     tv.setMaxWidth( w );
    

    }

© www.soinside.com 2019 - 2024. All rights reserved.