如何在同一行实现TextView内字符串的左对齐与右对齐?
同一行内实现TextView字符串左右对齐的解决方案
方案一:使用LinearLayout包裹两个TextView(最可靠)
这种方法简单直接,适配性强,能彻底规避单个TextView内的排版局限:
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center_vertical"> <TextView android:id="@+id/tv_left" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="Left" android:gravity="left"/> <TextView android:id="@+id/tv_right" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Right" android:gravity="right"/> </LinearLayout>
代码中直接给两个TextView设置对应文本即可,无需复杂的Span处理。
方案二:单个TextView内实现(适合必须用单个TextView的场景)
AlignmentSpan是段落级的排版控件(以换行符为段落分隔),所以同一行内无法用它实现左右对齐,可通过以下两种方式解决:
方法1:利用制表符+TabStopSpan
通过设置制表位,让右侧文本直接跳到TextView最右端:
String leftText = "Left"; String rightText = "Right"; // 用制表符分隔左右文本 SpannableString spannable = new SpannableString(leftText + "\t" + rightText); // 需在TextView测量完成后获取宽度,所以用post延迟执行 textView.post(() -> { int tabWidth = textView.getWidth() - textView.getPaddingLeft() - textView.getPaddingRight(); spannable.setSpan(new TabStopSpan.Standard(tabWidth), leftText.length(), leftText.length() + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); textView.setText(spannable); });
方法2:计算填充空格数(兼容性一般)
根据字体宽度计算需要填充的空格数,用空格将左右文本隔开:
String leftText = "Left"; String rightText = "Right"; textView.post(() -> { // 获取TextView的可用宽度 int availableWidth = textView.getWidth() - textView.getPaddingLeft() - textView.getPaddingRight(); // 计算左右文本和单个空格的宽度 Paint paint = textView.getPaint(); float leftWidth = paint.measureText(leftText); float rightWidth = paint.measureText(rightText); float singleSpaceWidth = paint.measureText(" "); // 计算需要填充的空格数量 int spaceCount = (int) ((availableWidth - leftWidth - rightWidth) / singleSpaceWidth); // 拼接最终字符串 String spaceStr = String.format("%" + spaceCount + "s", ""); textView.setText(leftText + spaceStr + rightText); });
注意:这种方法受字体、字符宽度影响较大,不同设备上可能出现排版偏差,优先推荐方案一。
内容的提问来源于stack exchange,提问作者KyluAce
相关产品推荐
相关产品推荐

