1行よりも長い場合、TextViewに楕円を表示するにはどうすればよいですか?


100

機能しない次のレイアウトがあります:

<LinearLayout 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:id="@+id/experienceLayout" 
    android:background="#ffffff" 
    android:layout_height="match_parent" 
    android:paddingLeft="6dp" 
    android:paddingRight="6dp" 
    android:paddingBottom="6dp" 
    android:paddingTop="6dp">

    <TextView 
        android:layout_weight="1" 
        android:id="@+id/experienceLabel" 
        android:text="Experience" 
        android:layout_height="wrap_content" 
        android:textColor="#000000" 
        android:layout_width="wrap_content" 
        android:textStyle="bold">
    </TextView>

    <TextView 
        android:id="@+id/experienceTextView" 
        android:text="TextView" 
        android:layout_height="wrap_content" 
        android:textColor="#000000" 
        android:layout_width="wrap_content" 
        android:ellipsize="end" 
        android:lines="1" 
        android:maxLines="1" 
        android:singleLine="true" 
        android:fadeScrollbars="false">
    </TextView>

</LinearLayout>

回答:


286

これはよくある問題です。以下を使用してみてください:

android:scrollHorizontally="true"
android:ellipsize="end" 
android:maxLines="1"

.............. scrollHorizo​​ntallyは、それを機能させる「特別なソース」です。


12
奇妙なことに...試してみましたandroid:scrollHorizontally="true"が、うまくいきませんでしたandroid:singleLine="true"。廃止された属性を使用する必要がありました。
Gerardo Contijoch

1
はいscrollHorizontallyが実際の鍵です...
Rishabh Dutt Sharma 2017

scrollHorizo​​ntally?明らかに、水平スクロール効果は必要ありません。
filthy_wizard 2017

@ user1232726:はい、「水平方向にスクロール」します。常識として、質問の日付と回答の日付を見てください。言うまでもありませんが、どちらも現在は(コメントする前に)関連するものではありません。
BonanzaDriver 2017

maxLinesでellipsizeを使用すると、アプリがクラッシュする可能性があります-Android Studio
intellisense


25

これを使って

android:ellipsize="end"  
android:singleLine="true"

どんな出力が来るかを完全に認識せずにこれを使用しないでください

android:ellipsize="end"  
android:maxLines="1"

使用maxlines = 1すると、ほとんどの文字が切り捨てられることがあります。


12

複数のデバイス/ APIでの動作はプログラムで次のようになりました(tvはTextViewです)。

    if (tv.getLineCount() > 1) {
        int lineEndIndex = tv.getLayout().getLineEnd(0);
        String text = tv.getText().subSequence(0, lineEndIndex - 3) + "\u2026";
        tv.setText(text);
    }

2
これは、すべての中で最も役立つ回答です...すべての単一のAPIで動作し、Utilsライブラリとして簡単に変換できます。
マリアーノゾリラ

1
あなたは、省略記号文字使用する必要があります\u2026代わりに、3つの.文字
クリススティルウェル

あなたは正しい@ChrisStillwellであり、コードでは省略記号を使用しています。回答を編集しました、ありがとうございます。:)
マリリア

3

したがって、上記のすべての回答は、1行だけで省略記号が表示されるという要件に対応しています。ただし、特定の行のテキストの後に省略記号を表示したい場合は、以下を使用する必要があります。

android:ellipsize="end"
android:maxLines="2"
android:singleLine="false"

これにより、省略記号は2行後にのみ表示されます。注:singleLineをfalseにすることが重要です。


デフォルト値はマニュアルに従って偽です:developer.android.com/reference/android/widget/...
ピエール


-1

android:singleLine廃止予定です。私の場合、の固定の高さを取得する必要がTextViewあり、android:linesではなく属性を使用しましたandroid:maxLines。これは私の問題と同じ問題を抱えている誰かを助けるかもしれないと思いました。

android:ellipsize="end"
android:lines="2"

違います。ドキュメントは、廃止については何も言っていない: developer.android.com/reference/android/widget/...は
cesards

@cesards興味深い。-このドキュメントは、それがあると言うdeveloper.android.com/reference/android/R.attr.html#singleLine
Reaz Murshed
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.