web-dev-qa-db-ja.com

テキストビューが省略されているかどうかを確認するにはどうすればよいですか?

_Android:ellipsize="end"_が設定された複数行のTextViewがあります。ただし、そこに配置する文字列が実際には長すぎる場合(ページのどこかに完全な文字列が表示されるようにするため)を知りたいです。

TextView.length()を使用して、文字列のおおよその長さが収まるかどうかを調べることができますが、複数行であるため、TextViewはいつ折り返すかを処理するため、常に機能するとは限りません。

何か案は?

68
FrederickCook

TextViewのレイアウトを取得し、行ごとの省略記号の数を確認できます。終了楕円の場合、次のように最後の行を確認するだけで十分です。

Layout l = textview.getLayout();
if (l != null) {
    int lines = l.getLineCount();
    if (lines > 0)
        if (l.getEllipsisCount(lines-1) > 0)
            Log.d(TAG, "Text is ellipsized");
}

これはレイアウトフェーズの後にのみ機能します。そうでない場合、返されるレイアウトはnullになるため、コードの適切な場所でこれを呼び出します。

112
Thorstenvv

textView.getLayoutを使用する方法ですが、問題は、レイアウトが準備されていない場合にnullを返すことです。以下のソリューションを使用してください。

 ViewTreeObserver vto = textview.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
           Layout l = textview.getLayout();
           if ( l != null){
              int lines = l.getLineCount();
              if ( lines > 0)
                  if ( l.getEllipsisCount(lines-1) > 0)
                    Log.d(TAG, "Text is ellipsized");
           }  
        }
    });
31

この質問に対する最も簡単な解決策は次のコードだと思います:

String text = "some looooong text";
textView.setText(text);
boolean isEllipsize = !((textView.getLayout().getText().toString()).equalsIgnoreCase(text));

このコードは、XMLでTextViewがmaxLineCountを設定することを想定しています:)

20

これは私に働いた:

textView.post(new Runnable() {
                        @Override
                        public void run() {
                            if (textView.getLineCount() > 1) {
                                //do something
                            }
                        }
                    });
4
Cícero Moura

public int getEllipsisCount(int line)

省略される文字の数を返します。省略が行われない場合は0を返します。

だから、単に呼び出す:

int lineCount = textview1.getLineCount();

if(textview1.getLayout().getEllipsisCount(lineCount) > 0) {
   // Do anything here..
}

レイアウトが設定される前にgetLayout()を呼び出すことはできないため、これを使用します。

ViewTreeObserver vto = textview.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
       Layout l = textview.getLayout();
       if ( l != null){
          int lines = l.getLineCount();
          if ( lines > 0)
              if ( l.getEllipsisCount(lines-1) > 0)
                Log.d(TAG, "Text is ellipsized");
       }  
    }
});

最後に、不要になったときにremoveOnGlobalLayoutListenerを削除することを忘れないでください。

3
amalBit
lateinit var toggleMoreButton: Runnable
toggleMoreButton = Runnable {
  if(reviewTextView.layout == null) { // wait while layout become available
       reviewTextView.post(toggleMoreButton) 
       return@Runnable
  }
  readMoreButton.visibility = if(reviewTextView.layout.text.toString() != comment) View.VISIBLE else View.GONE
}
reviewTextView.post(toggleMoreButton)

それはいくつかの典型的なケースです:

  1. 「reviewTextView」のコメント
  2. コメントはいくつかの基準で折りたたむことができます
  3. コメントが折りたたまれた場合、ボタン「readMoreButton」を表示します
3
A.Y.

このまさに問題に対するリスナー通知を使用して、カスタムTextViewを作成しました。また、複数行の楕円の問題も修正します。 Android ellipsize multiline textview に投稿されています。

2
Micah Hainline

それは私のために働いています

if (l != null) {
    int lines = l.getLineCount();
     if (lines > 0) {
     for (int i = 0; i < lines; i++) {
     if (l.getEllipsisCount(i) > 0) {
      ellipsize = true;
      break;
     }
    }
   }
  }
1
coffee

たとえば、RecyclerViewの項目からダイアログに完全なデータを渡すために、実際に動作します。

holder.subInfo.post(new Runnable() {
                @Override
                public void run() {
                    Layout l = holder.subInfo.getLayout();
                    if (l != null) {
                        final int count = l.getLineCount();
                        if (count >= 3) {
                            holder.subInfo.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View view) {
                                    final int c = holder.subInfo.getLineCount();
                                    if (c >= 3) {
                                        onClickToShowInfoDialog.showDialog(holder.title.getText().toString(), holder.subInfo.getText().toString());
                                    }
                                }
                            });
                        }
                    }
                }
            });
0