19

私はこれを持っていますTextView。その一部は左に、一部は右に配置されるはずです。Javaでこれを行うにはどうすればよいですか?

基本的に、最初の行を左に揃え、次の行を右に揃えるというようにします。

誰でも手がかりを得ましたか?

編集

私は HTML を使用しようとしましたが、それがうまくいかなかったときにスパンを試しました。

htmlの試み

textView.setText(Html.fromHtml("<p align=\"right\">THIS IS TO THE RIGHT</p>"));

そして、ここにスパンの試みがあります

    String LeftText = "LEFT";
    String RightText = "RIGHT";

    final String resultText = LeftText + "  " + RightText;
    final SpannableString styledResultText = new SpannableString(resultText);
    styledResultText.setSpan(new AlignmentSpan.Standard(Alignment.ALIGN_OPPOSITE), LeftText.length() + 1, LeftText.length() + 2 +RightText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    textView.setText(styledResultText);

しかし、どれも機能していないようです。

4

6 に答える 6

24
TextView resultTextView = new TextView(this);
final String resultText = LeftText + "  " + RightText;
final SpannableString styledResultText = new SpannableString(resultText);
styledResultText.setSpan(new AlignmentSpan.Standard(Alignment.ALIGN_OPPOSITE)
    , LeftText.length() + 2
    , LeftText.length() + 2 + RightText.length()
    , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
resultTextView.setText(styledResultText);

Alignment.ALIGN_OPPOSITE is the equivalent for right side.

Alignment.ALIGN_NORMAL is the equivalent for left side.

于 2013-01-25T11:35:38.417 に答える
8

Spannable で動作するソリューションを次に示します。左右が広すぎると、同じライン上で重なるというキャベートがあります。スパナブルで左/右のトリックを行うには、左と右の間の改行が必要なので、私の修正は、1 つの改行に対して行の高さをゼロ (つまり、重なった行) に減らすスパナブルを追加し、その後通常の行の高さを復元することです。それ。

    String fullText = leftText + "\n " + rightText;     // only works if  linefeed between them! "\n ";

    int fullTextLength = fullText.length();
    int leftEnd = leftText.length();
    int rightTextLength = rightText.length();

    final SpannableString s = new SpannableString(fullText);
    AlignmentSpan alignmentSpan = new AlignmentSpan.Standard(Layout.Alignment.ALIGN_OPPOSITE);
    s.setSpan(alignmentSpan, leftEnd, fullTextLength, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    s.setSpan(new SetLineOverlap(true), 1, fullTextLength-2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    s.setSpan(new SetLineOverlap(false), fullTextLength-1, fullTextLength, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

そして、重複する行を処理するための小さなルーチンがあります。

    private static class SetLineOverlap implements LineHeightSpan {
    private int originalBottom = 15;        // init value ignored
    private int originalDescent = 13;       // init value ignored
    private Boolean overlap;                // saved state
    private Boolean overlapSaved = false;   // ensure saved values only happen once

    SetLineOverlap(Boolean overlap) {
        this.overlap = overlap;
    }

    @Override
    public void chooseHeight(CharSequence text, int start, int end, int spanstartv, int v,
                             Paint.FontMetricsInt fm) {
        if (overlap) {
            if (!overlapSaved) {
                originalBottom = fm.bottom;
                originalDescent = fm.descent;
                overlapSaved = true;
            }
            fm.bottom += fm.top;
            fm.descent += fm.top;
        } else {
            // restore saved values
            fm.bottom = originalBottom;
            fm.descent = originalDescent;
            overlapSaved = false;
        }
    }
}
于 2016-04-07T22:42:02.527 に答える
5

ヒントをありがとう、@Frank、しかしこれで十分でした:

public class LineOverlapSpan implements LineHeightSpan {
    @Override
    public void chooseHeight(final CharSequence text, final int start, final int end, final int spanstartv, final int v, final Paint.FontMetricsInt fm) {
        fm.bottom += fm.top;
        fm.descent += fm.top;
    }
}

次のように使用します。

CharSequence text = return new Truss()
        .append("LEFT")
        .pushSpan(LineOverlapSpan())
        .append("\n")
        .popSpan()
        .pushSpan(AlignmentSpan.Standard(Layout.Alignment.ALIGN_OPPOSITE))
        .append("RIGHT")
        .build()

どこTrussですか

SpannableStringBuilder目を刺したくない APIのラッパーです。

于 2016-09-11T03:12:06.517 に答える
2

2 つのソリューション:

1)行ごとに異なるテキストビューを持ち、その重力を設定します。

2) データの読み込み中に Html を使用して、html で配置を 設定ます

また

3:スパンを使用することになります。

于 2013-01-25T11:28:05.487 に答える
0

textview の Simple.Adjust xml 部分。レイアウトを使用します。テキストビューを左に表示したい場合

android:alignParentLeft="true" 整列の詳細については、こちらをご覧ください。

http://developer.android.com/reference/android/widget/RelativeLayout.LayoutParams.html

これは、さまざまなレイアウトの例でもあります。

http://www.androidhive.info/2011/07/android-layouts-linear-layout-relative-layout-and-table-layout/

于 2013-01-25T11:34:50.860 に答える