82

設定したマルチラインTextViewがありandroid:ellipsize="end"ます。ただし、そこに配置した文字列が実際に長すぎるかどうかを知りたいです (ページの他の場所に完全な文字列が表示されるようにするため)。

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

何か案は?

4

18 に答える 18

131

のレイアウトを取得し、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 になるため、コード内の適切な場所でこれを呼び出します。

于 2010-10-24T14:54:27.953 に答える
37

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);        
    }
});
于 2013-10-08T07:20:32.167 に答える
36

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

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

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

于 2015-11-06T11:47:44.960 に答える
9

これは私に働いた:

textView.post(new Runnable() {
                        @Override
                        public void run() {
                            if (textView.getLineCount() > 1) {
                                //do something
                            }
                        }
                    });
于 2018-07-27T17:05:22.483 に答える
5

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が不要になったら削除することを忘れないでください。

于 2014-02-21T07:32:05.410 に答える
3
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」を表示します
于 2018-12-22T05:32:32.247 に答える
1

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

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;
     }
    }
   }
  }
于 2016-08-29T03:58:53.547 に答える
0

テキストビューに複数の段落が含まれている場合、 getEllipsisCount を使用しても、その中の空の行には機能しません。段落の最終行の getEllipsisCount は 0 を返します。

于 2021-04-19T20:41:57.163 に答える
-1

を使用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その後、フラグを使用して必要なことを行うことができます。

于 2015-02-14T17:18:05.663 に答える