_Android:ellipsize="end"
_が設定された複数行のTextView
があります。ただし、そこに配置する文字列が実際には長すぎる場合(ページのどこかに完全な文字列が表示されるようにするため)を知りたいです。
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");
}
}
});
この質問に対する最も簡単な解決策は次のコードだと思います:
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(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を削除することを忘れないでください。
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)
それはいくつかの典型的なケースです:
このまさに問題に対するリスナー通知を使用して、カスタムTextViewを作成しました。また、複数行の楕円の問題も修正します。 Android ellipsize multiline textview に投稿されています。
それは私のために働いています
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;
}
}
}
}
たとえば、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());
}
}
});
}
}
}
});