如何在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
相关产品推荐
相关产品推荐

