singleLine="true"でハマって怖くなったメモ(ja)

Android

業務でハマったのでメモ程度に書き残し。

はじめに

※!!この記事の内容は、時間の経過・Android APIのアップデートとともに最新ない可能性がありますことを、ご了承ください。!!

android:singleLine=”true”とは

AndroidのTextViewで、

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

の両方を指定するケースがまれにあると思う。

長文文字列の最後に省略文字の 「…」 を付与しつつ、1行に収めたい際に指定するケースが多いもよう。実際にこの方法が推奨されることが多いようで、Google先生に尋ねたところ、検索結果ページ上位に現れる下記ページでも勧められていた。

個人的に困った問題点: TextView上でViewPagerの横スワイプが効かない

僕がハマった問題は、この

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

を指定したTextView上で、ViewPagerのスワイプを行おうとしたところ横スワイプ出来ないという問題です。

詳しく調べたところ、公式サイトではこのような記述が。

Sets the properties of this field (lines, horizontally scrolling, transformation method) to be for a single-line input.

horizontally scrolling,

これだと思い、内部コードをヨミヨミ。見つけました。

private void applySingleLine(boolean singleLine, boolean applyTransformation,
  boolean changeMaxLines) {
  mSingleLine = singleLine;
  if (singleLine) {
    setLines(1);
    setHorizontallyScrolling(true);
    ....

ほー。つまりViewPagerのhorizontal scrollingと、こいつのがバッティングしてる感じなのかなーと。

見つけた解決策: android:lines=”1”

ということで、ここでは1行にすることだけを実現できればいいので、setLines(1)に替わる

android:lines="1"

を指定したところ、うまくスワイプできるようになりましたとさ。

注意点とおまけ

注意点

これで僕のケースだと、一旦はめでたしめでたしだったのですが、実は

android:lines="1"

の指定の場合、 TextViewにセットする文字列で、 ellipsize される以前のものに改行コードなどが入っているとそこで改行が行われる(けど1行指定なので、途中で切れたような形になる)ので、ellipsize する前に改行されることが想定される場合は別の解決策を考える必要があるかもです。(もしくはいい案あればコメントでぜひ教えていただきたいですorz)

おまけ

注意点で

android:singleLine="true"
の場合はここの改行による表示の崩れはないようです。

と言いつつも、

実はTextViewのソースコードを読んでいた時に見つけたもの。

@SuppressWarnings("deprecation")
  public TextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    ...
    // If set, the input type overrides what was set using the deprecated singleLine flag.
    singleLine = !isMultilineInputType(inputType);

TextViewで deprecated 指定がされているコンストラクタの処理なのですが、ここで

If set, the input type overrides what was set using the deprecated singleLine flag.

singleLineってそもそも deprecated!?疑惑。どっちなのさー。

それについてはこちらでも議論が交わされていましたとさ:

Edittext single line in Android - Stack Overflow

結論

Android開発怖いことがいっぱい(;´Д`)怖い怖い

※ ご指摘・アドバイス等ありましたらコメントでも twitter メンションでも何でもくださいm(__)m

[へ (@shohe_i) Twitter](https://twitter.com/shohe_i)