visible true

技術的なメモを書く

TextViewが省略されたかどうかを確認する

ググってもだいたいEllipsizeの設定で自動省略の話しか出てこないのでメモる。

やりたい事

TextViewが省略表示になっているかを確認して処理したい、というモノ。

isTextTruncated()を作る

TextViewUtilsとか適当に作る。おおむねgetLatyout()とかgetLineCount()とかgetEllipsisCount()とか使うと省略かどうかわかる

public class TextViewUtils {
  public static boolean isTextTruncated(TextView textView) {
    if (textView == null) {
      return false;
    }
    Layout layout = textView.getLayout();
    if (layout == null) {
      return false;
    }
    int lines = layout.getLineCount();
    if (lines < 1) {
      return false;
    }
    int ellipsisCount = layout.getEllipsisCount(lines - 1);
    return ellipsisCount > 0;
  }
}

こういう時に使える

ほぼ存在しないとおもうけどこんなケース

f:id:sys1yagi:20150929172825j:plain

View作成直後は省略されたか分からないのでonSizeChanged()のタイミングとかでやる。

public class CustomView extends LinearLayout {
  TextView text;
  public CustomView(Context context, AttributeSet attrs) {
    super(context, attrs);
    LayoutInflater.from(context).inflate(R.layout.content_main, this);
    text = (TextView) findViewById(R.id.text);
  }
  @Override
  protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    if (TextViewUtils.isTextTruncated(text)) {
      //なんかレイアウト変える
    }
  }
}

Custom Viewじゃない場合ViewTreeObserver.OnGlobalLayoutListenerとかでやればいけそうだけど大変そう。

おわりに

  • 省略されたかどうか確認できる。
  • 使いたいケースはそんなになさそう。
  • singleLine=trueの時しか使えないです