You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android Studio的Main_Activity.java中实现诗歌式文本对齐?

实现诗歌式文本排版:每行前半部分左对齐,最后一个单词右对齐

嘿,我完全get到你想要的排版效果啦——4行文本,每行除了最后一个单词靠右,其余内容都靠左。下面给你两种实用的实现方案,都能在MainActivity.java里轻松搞定:

方案1:用SpannableString实现(单TextView搞定)

这种方式不需要额外布局,直接通过SpannableString给文本设置差异化对齐样式,代码简洁又灵活:

import android.os.Bundle;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.AlignmentSpan;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView poemTextView = findViewById(R.id.poem_text);
        
        // 替换成你的4行诗歌内容
        String[] poemLines = {
                "我打江南走过 那等在季节里的容颜",
                "如莲花的开落 东风不来",
                "三月的柳絮不飞 你的心如小小的寂寞的城",
                "恰若青石的街道向晚 跫音不响"
        };

        StringBuilder fullPoem = new StringBuilder();
        for (String line : poemLines) {
            // 分割每行内容,取出最后一个单词
            String[] words = line.split(" ");
            if (words.length <= 1) {
                fullPoem.append(line).append("\n");
                continue;
            }
            // 拼接前面的内容
            StringBuilder frontPart = new StringBuilder();
            for (int i = 0; i < words.length - 1; i++) {
                frontPart.append(words[i]).append(" ");
            }
            String frontText = frontPart.toString().trim();
            String lastWord = words[words.length - 1];

            // 给当前行生成带对齐样式的Spannable文本
            SpannableString lineSpan = new SpannableString(frontText + " " + lastWord);
            // 给最后一个单词设置右对齐
            int startIndex = frontText.length() + 1;
            lineSpan.setSpan(new AlignmentSpan.Standard(AlignmentSpan.ALIGN_OPPOSITE),
                    startIndex, lineSpan.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            
            fullPoem.append(lineSpan).append("\n");
        }

        poemTextView.setText(fullPoem);
    }
}

对应的布局文件activity_main.xml只需要一个普通TextView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    android:orientation="vertical">

    <TextView
        android:id="@+id/poem_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:lineSpacingExtra="8sp"/>

</LinearLayout>

方案2:用LinearLayout拆分每行(更直观,适合复杂样式)

如果需要给前后部分设置不同的字体、颜色或粗细,这种拆分每行的方式可控性更强:

先在activity_main.xml里定义每行的布局结构:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    android:orientation="vertical"
    android:gap="8dp">

    <!-- 第一行 -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <TextView
            android:id="@+id/line1_front"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="我打江南走过 那等在季节里的"
            android:textSize="18sp"/>
        <TextView
            android:id="@+id/line1_last"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="容颜"
            android:textSize="18sp"/>
    </LinearLayout>

    <!-- 第二行 -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <TextView
            android:id="@+id/line2_front"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="如莲花的开落 东风"
            android:textSize="18sp"/>
        <TextView
            android:id="@+id/line2_last"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="不来"
            android:textSize="18sp"/>
    </LinearLayout>

    <!-- 第三、四行直接复制上面的LinearLayout结构即可 -->

</LinearLayout>

然后在MainActivity.java里可以动态设置文本(适合从数据源加载内容的场景):

import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 示例:动态设置第一行内容
        TextView line1Front = findViewById(R.id.line1_front);
        TextView line1Last = findViewById(R.id.line1_last);
        line1Front.setText("我打江南走过 那等在季节里的");
        line1Last.setText("容颜");

        // 其他行按同样方式设置即可
    }
}

两种方案各有优势:方案1适合文本内容动态生成的场景,代码更精简;方案2适合需要给前后部分设置差异化样式的情况,灵活性更高。你可以根据自己的需求挑选~

内容的提问来源于stack exchange,提问作者Mr.Mark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:36:04