java - Android TextView 左右对齐文本

标签 java android

我正在尝试创建一个包含两个文本的 TextView,一个在 TextView 的左侧对齐,一个在 的右侧对齐 TextView

我提到了这个 [ Android TextView Align text to Right and Left (@daemontus) 用于设置文本。

但是,如果我先在 TextView 右侧输入文本,然后在 TextView 左侧输入文本,如何添加文本

1)输入:输入Button 1显示Text1

enter image description here

2)输出:输入Button 2显示Text2和Text1

enter image description here

public void setLeftRightText(TextView view, String left, String right,Enum keysel) {
if(keysel == RSK_KEY) {
        SpannableString merged=new SpannableString(left + "\n" + right);
        merged.setSpan(
                new AlignmentSpan.Standard(Layout.Alignment.ALIGN_NORMAL),
                0, left.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE
        );
        merged.setSpan(
                new LineOverlapSpan(),
                left.length(), left.length() + 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE
        );
        merged.setSpan(
                new AlignmentSpan.Standard(Layout.Alignment.ALIGN_OPPOSITE),
                left.length() + 1, left.length() + 1 + right.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE
        );
        view.setText(merged);
    }
    else if (keysel == LSK_KEY){
        final String resultText = right + "  " + left;
        final SpannableString styledResultText = new SpannableString(resultText);
        styledResultText.setSpan((new AlignmentSpan.Standard(Layout.Alignment.ALIGN_OPPOSITE )), left.length() + 2, left.length() + 2 +right.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        styledResultText.setSpan((new AlignmentSpan.Standard(Layout.Alignment.ALIGN_NORMAL )), 0, left.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        view.setText(styledResultText);

    }

}

LineOverlapSpan.java

public class LineOverlapSpan implements LineHeightSpan {

    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;
    }
}

最佳答案

您可以在单个 TextView 中获得所需的结果。创建一个扩展 TextView 的 View 并覆盖 onDraw

我举了一个小例子。希望它至少能给你一个想法

public class LeftRightTextView extends AppCompatTextView {

    private TextPaint mTextPaint;
    private String mLeftText, mRightText;

    public LeftRightTextView(Context context) {
        this(context, null);
    }

    public LeftRightTextView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public void setLeftText(String leftText) {
        mLeftText = leftText;
        setText(mLeftText);
    }

    public void setRightText(String rightText) {
        mRightText = rightText;
        invalidate();
    }

    public LeftRightTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.LeftRightTextView, defStyleAttr, 0);
        mLeftText = typedArray.getString(R.styleable.LeftRightTextView_lr_left_text);
        mRightText = typedArray.getString(R.styleable.LeftRightTextView_lr_right_text);
        typedArray.recycle();
        setText(mLeftText);
        mTextPaint = new TextPaint();
        mTextPaint.setColor(getCurrentTextColor());
    }

    @Override
    protected void onDraw(Canvas canvas) {
        //let it draw the left text as usual
        super.onDraw(canvas);

        //Now draw the right text
        int rightEnd = getWidth() - getPaddingRight();
        float textWidth = mTextPaint.measureText(mRightText);
        canvas.drawText(mRightText, rightEnd - textWidth, mTextPaint.getFontMetrics().descent - mTextPaint.getFontMetrics().ascent, mTextPaint);

    }
}

和属性

<declare-styleable name="LeftRightTextView">
    <attr name="lr_left_text" format="string"/>
    <attr name="lr_right_text" format="string"/>
</declare-styleable>

布局中

<me.srs.myapplication.LeftRightTextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:lr_left_text="Hello"
    app:lr_right_text="World"/>

这是结果

The result in layout preview

关于java - Android TextView 左右对齐文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48679111/

相关文章:

java - 配置弹出窗口的宽度、换行和字体

java - 为什么 addAll 会清除从中提取数据的 ArrayList?

android - 如何在 webview android 6 中打开 pdf

android - 将变换动画从 View 应用到另一个 View

java - 获取网页中所有HTTP url

java - 排序 Map<String, Object[]>

java - 在数据库中插入记录时发送邮件

java - 为什么我需要一个函数式接口(interface)来使用 lambdas?

android - 为 Android 使用 OpenCv contrib 模块

android - debugview firebase 中没有可用的设备