41

私の問題はHow to get a layout where one text can grow and ellipsize, but not gobble up the other elements on the layoutに非常に似ていますが、そこで提案されているように TableLayouts を使用できない理由を以下で読んでください。

基本的に次のようなリストビュー行を作成しようとしています:

| | テキストビュー | ビュー 1 | ビュー 2 |

すべてのビューには、可変幅の要素が含まれています。TextView には ellipsize="end" が設定されています。ビュー 1 は TextView の左側に配置し、ビュー 2 は画面の右側に配置する必要があります。そのため、通常、View 1 と View 2 の間には空白があります。TextView 内のテキストが長くなると、TextView も大きくなり、空白がなくなるまで View 1 が右に押し出されます。次に、楕円サイズが開始され、TextView でテキストが切り取られ、最後に省略記号 ("...") が追加されます。

したがって、結果は次のようになります。

+----------------------------------------+
| short text [view1]             [view2] |
+----------------------------------------+
| long text with ell ... [view1] [view2] |
+----------------------------------------+

私はもう試した:

  • TableLayouts ですが、一部のデバイスではスクロールが非常に遅くなるようです。
  • RelativeLayouts ですが、ビューが重なっているか、view1 または view2 が完全に消えてしまいました。
  • ただし、TextView は常に画面の幅全体を占めるまで拡大するため、view1 と view2 が画面の外に押し出されます。

これは私が試したGridLayoutです:

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

    <TextView
        android:layout_gravity="left|fill_horizontal"
        android:ellipsize="end"
        android:singleLine="true"
        android:text="Long text to demonstrate problem with TextView in GridLayout taking up too much space despite ellipsis" />

    <TextView
        android:layout_gravity="left"
        android:text="(view1)" />

    <TextView
        android:layout_gravity="right"
        android:text="(view2)" />
</GridLayout>

View 1 と View 2 は実際には TextView ではありません。単純化するために例で使用しています。

TableLayouts を使用せずにこれを達成する方法はありますか?

編集: 要求に応じて、RelativeLayout を使用してこれを解決しようとする試みを次に示します。この場合、TextView は画面の全幅を占有するため、view1 も view2 も表示されません。

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

    <TextView
        android:id="@+id/rl0"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:ellipsize="end"
        android:singleLine="true"
        android:text="Long text to demonstrate problem with TextView in GridLayout taking up too much space despite ellipsis" />

    <TextView
        android:id="@+id/rl1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/rl0"
        android:layout_marginLeft="10dp"
        android:text="(view1)" />

    <TextView
        android:id="@+id/rl2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/rl1"
        android:layout_alignParentRight="true"
        android:layout_marginLeft="10dp"
        android:text="(view2)" />
</RelativeLayout>
4

14 に答える 14

21

GridLayout の TextView が無制限に成長して他のビューを押し出すのを防ぐための潜在的な解決策を見つけたようです。これが以前に文書化されているかどうかはわかりません。

fill layout_gravity を使用し、楕円サイズ化が必要な long TextView に任意の layout_width または width を設定する必要があります。

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

GridLayout と android.support.v7.widget.GridLayout の両方で機能します

于 2015-12-04T23:33:08.653 に答える
2

ビュー3を右に固定し、そこから開始してビューに区切られた領域を強制することで解決できるレイアウトに小さな問題があると思います(したがって、楕円を適切に設定できます):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content">
<TextView
        android:id="@+id/rl3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:text="(view2)" />
<TextView
        android:id="@+id/rl2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@id/rl3"
        android:text="(view1)" />
<TextView
        android:id="@+id/rl1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:singleLine="true"
        android:layout_alignParentLeft="true"
        android:layout_toLeftOf="@id/rl2"
        android:text="Long text to demonstrate problem with TextView in GridLayout taking up too much space despite ellipsis" />
</RelativeLayout>

お役に立てれば...

よろしく!

于 2013-07-24T18:52:17.490 に答える
0

右側のビューが意図的にテキストによって押し出される場合は、GridView の代わりに ListView を使用することもできます。

リスト アイテム レイアウトのベースを RelativeLayout にして、次のようにルールを設定するだけです。

  1. 右側の 2 つのビューを alignParentRight (android:layout_alignParentLeft="true" を使用) に設定できますが、最初のビューが 2 番目のビューの左側にあることを確認して、ビューが伸びるにつれて左側に移動するようにします。

  2. 左側の TextView を左に揃えることができますが、最初のビューの左側にとどまる (android:layout_toLeftOf="@+id/viewId" を使用) ため、ビューと重ならなくなります。

于 2013-07-22T23:16:47.180 に答える
0

グリッドレイアウトでも同じ問題がありました。私がしたことは、テキストビューに固定幅が与えられ、layout_columnWeight各テキストビューにプロパティが与えられ、問題が修正されたことです。

           <TextView
                android:id="@+id/txtName"
                style="@style/MyDetailTitle"
                android:layout_width="@dimen/detail_length"
                android:layout_height="wrap_content"
                android:text="@string/app_name"
                app:layout_column="3"
                app:layout_columnWeight="1"
                app:layout_gravity="start"
                app:layout_row="1" />
于 2016-02-17T08:04:54.770 に答える
0

ケース番号2(長いテキストを持つもの)の解決策を見つけました:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:weightSum="3" >

    <TextView
        android:id="@+id/rl0"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:ellipsize="end"
        android:singleLine="true"
        android:text="Long text to demonstrate problem with TextView in GridLayout taking up too much space despite ellipsis" />

    <TextView
        android:id="@+id/rl1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_weight="1"
        android:text="(view1)" />

    <TextView
        android:id="@+id/rl2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_weight="1"
        android:text="(view2)" />

</LinearLayout>

本当の問題はケース 1 であり、私はこれについて多くのことを試みませんでした。それが役に立てば幸いです (そして、もっと時間があれば、最初の 1 つを達成しようとします!)。

于 2013-07-18T08:57:37.593 に答える
0

これを試して

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:baselineAligned="false"
    android:orientation="horizontal">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center">
       <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ellipsize="end"
            android:singleLine="true"
            android:text="Long text to demonstrate problem with TextView in GridLayout taking up too much space despite ellipsis"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center">
        <TextView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_gravity="left"
             android:text="(view1)"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center">
        <TextView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_gravity="right"
             android:text="(view2)"/>
    </LinearLayout>

</LinearLayout>

現在、すべてのビューが中央に配置されています。android:gravityニーズに合わせてプロパティを変更できます。たとえば、view1右とview2左を揃えたい場合、最後の 2 つLinearLayoutの s は次のようになります (右と左にそれぞれ 5 dp のマージンがあります)。

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:gravity="center|right">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="left"
        android:layout_marginRight="5dp"
        android:text="(view1)"/>
</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:gravity="center|left">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:layout_marginLeft="5dp"
        android:text="(view2)"/>
</LinearLayout>
于 2013-07-15T15:21:31.783 に答える