4

2 行のテキストを含む TextView をセットアップしようとしています。2 行目は最初の行よりも短くなっています。

TextView の Layout インスタンス (TextView.getLayout() 経由で取得) を設定して 2 行目を切り捨てる方法はありますか、それとも私が認識していない別の方法がありますか?

編集1

私の意図の誤解がありました: 私は、任意のテキストを設定できる方法でレイアウトされたテキストビューを設定しようとしています. 長さに応じて、次のことが起こります.テキストビューのコンテンツ幅と同じ幅の行ですが、2行目は短くする必要があります。たとえば、半分の幅です。ただし、テキストが十分に長い場合は、2 行目が必要です。

抽象クラス Layout をチェックアウトしましたが、それはサブクラスであり、関数があります

public int getLineEnd(int line)

行の最後の文字の位置を返します。テキストを設定してから、2 行目のレイアウトの幅を確認してから、テキストを短いバージョンに変更する方法があります。とにかく、それはハックな方法のようですが、レイアウトインスタンスを自分で設定できれば(ゲッターなどのセッターメソッドを介して)、よりクリーンで安定したものにすることができます

TextView.getLayout().

カスタム レイアウトを Textview のサブクラスに設定した人はいますか?

編集2 /私自身の解決策

解決策が見つかりました: 2 番目の行が、2 番目の行を短くする理由となった領域と重なっているかどうかを確認しています。もしそうなら、私はテキストを切り捨てています。私が使用した機能:

TextView.getLineCount()
TextView.getLayout().getLineStart(int line)
TextView.getLayout().getLineEnd(int line)
TextView.getPaint().measureText()

たぶん、それは将来の誰にも役立ちます。

ただし、独自のレイアウトを設定する方法については、まだ回答がありません。

4

4 に答える 4

0

私は同じ問題に遭遇しました、ここに私の解決策があります:


これがコードです。テキストの長さを計算して切り捨てるtruncateTextメソッドです。

public class LastLineControlTextView extends TextView{

private int mMaxLines;
private float mLastLineRatio = 0.5f;
private float mLastLineWidth;
private float mAllowLength;

public LastLineControlTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    mLastLineWidth = getWidth()*mLastLineRatio;
    mAllowLength = (mMaxLines-1)*getWidth()+mLastLineWidth;
    if(!TextUtils.isEmpty(getText())){
        truncateText(getText());
    }
}

@Override
public void setText(CharSequence text, BufferType type) {
    super.setText(text, type);
    if(mAllowLength==0)
        return;
    truncateText(text);
}

@Override
public void setMaxLines(int maxlines) {
    super.setMaxLines(maxlines);
    mMaxLines = maxlines;
}

private void truncateText(CharSequence text){
    float width = Layout.getDesiredWidth(text, getPaint());
    int end = text.length();
    while(width > mAllowLength){
        width = Layout.getDesiredWidth(text, 0, end, getPaint());
        end--;
    }
    if(end==text.length())
        return;
    CharSequence processed = text.subSequence(0, end);
    System.out.println("end:"+end+"processed:"+processed);
    setText(processed);
}
}

于 2013-04-25T06:31:53.183 に答える
0

http://developer.android.com/reference/android/widget/TextView.html#attr_android:maxLines

TextView の高さを最大でこの行数にします。

「100」などの整数値である必要があります。

これは、グローバル属性リソース シンボル maxLines に対応します。

また、次を使用することもできます。

http://developer.android.com/reference/android/widget/TextView.html#attr_android:ellipsize

設定されている場合、ビューの幅よりも長い単語を途中で分割するのではなく、楕円形にします。多くの場合、scrollHorizo​​ntally または singleLine も同様に設定して、テキスト全体が複数行に分割されるのではなく、1 行に制限されるようにします。

次の定数値のいずれかである必要があります。

なし start middle end マーキー これは、グローバル アトリビュート リソース シンボル ellipsize に対応します。

于 2012-08-21T15:33:20.757 に答える
0

android:maxLines="1"XML またはアクティビティで使用してみてくださいtextView.setMaxLines(1);

于 2012-08-21T15:31:33.010 に答える