/** * @param view TextView * @param maxLines 最大行数 * @param where 省略する箇所 */ public static void setMultilineEllipsize(TextView view, int maxLines, TruncateAt where) { if (maxLines >= view.getLineCount()) { // ellipsizeする必要無し return; } float avail = 0.0f; for (int i = 0; i < maxLines; i++) { avail += view.getLayout().getLineMax(i); } CharSequence ellipsizedText = TextUtils.ellipsize( view.getText(), view.getPaint(), avail, where); view.setText(ellipsizedText); }TextUtils#ellipsize()はavailで指定された範囲に文字列をいい具合にカットしてくれるAPIです。
availはLayout#getLineMax()で指定行の描画範囲が取得できるので、それを最大行(maxLines)までの範囲を足してもとめます。
使用例
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final TextView tv = (TextView) findViewById(android.R.id.text1); tv.setText(R.string.attack_on_titan); tv.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { tv.getViewTreeObserver().removeGlobalOnLayoutListener(this); setMultilineEllipsize(tv, 3, TruncateAt.END); } }); }TextView#getLayout()などは描画後じゃないと取得できないので、OnGlobalLayoutListenerを使います。
activity_main.xml
<TextView android:id="@android:id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" />TextViewにellipsize,maxLinesは設定しないでください。
実行
- Ellipsize=START, MaxLines=1
- Ellipsize=MIDDLE, MaxLines=3
- Ellipsize=END, MaxLines=5
- Ellipsize=END, MaxLines=20