設定したマルチラインTextViewがありandroid:ellipsize="end"ます。ただし、そこに配置した文字列が実際に長すぎるかどうかを知りたいです (ページの他の場所に完全な文字列が表示されるようにするため)。
TextView.length()文字列のおおよその長さが収まるかどうかを使用して見つけることができましたが、複数行であるTextViewため、いつ折り返すかをハンドルするため、これは常に機能するとは限りません。
何か案は?
のレイアウトを取得し、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 になるため、コード内の適切な場所でこれを呼び出します。
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");
}
}
});
リスナーを削除するためのコード スニペット ( source ):
mLayout.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
public void onGlobalLayout() {
scrollToGridPos(getCenterPoint(), false);
mLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
この質問に対する最も簡単な解決策は、次のコードだと思います。
String text = "some looooong text";
textView.setText(text);
boolean isEllipsize = !((textView.getLayout().getText().toString()).equalsIgnoreCase(text));
このコードは、XML で TextView がmaxLineCount:)を設定していることを前提としています。
これは私に働いた:
textView.post(new Runnable() {
@Override
public void run() {
if (textView.getLineCount() > 1) {
//do something
}
}
});
public int getEllipsisCount (整数行) :
省略される文字数を返します。省略しない場合は 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が不要になったら削除することを忘れないでください。
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)
これはいくつかの典型的なケースです:
それは私のために働いています
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;
}
}
}
}
テキストビューに複数の段落が含まれている場合、 getEllipsisCount を使用しても、その中の空の行には機能しません。段落の最終行の getEllipsisCount は 0 を返します。
を使用getEllipsisCountしても、空の行が含まれるテキストでは機能しません。次のコードを使用して動作させました:
message.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
if(m.isEllipsized == -1) {
Layout l = message.getLayout();
if (message.getLineCount() > 5) {
m.isEllipsized = 1;
message.setMaxLines(5);
return false;
} else {
m.isEllipsized = 0;
}
}
return true;
}
});
maxLineCountXML にa を設定しないでください。次に、コードで をチェックし、lineCountそれが特定の数より大きい場合は、 false を返して の描画をキャンセルしTextView、行数と、テキスト ビューが長すぎるかどうかを保存するフラグを設定できます。 . テキストビューは正しい行数で再び描画され、フラグで省略されているかどうかがわかります。
isEllipsizedその後、フラグを使用して必要なことを行うことができます。