在 Android 界面開發中,常需在 TextView 中展示「固定標籤 + 動態數據」的組合文本,例如:「用戶名:張三」「餘額:¥100.00」「狀態:在線」。這裡的「用戶名:」「餘額:」「狀態:」為靜態文本,「張三」「¥100.00」「在線」為動態數據。
String label = "用戶名:";
String dynamicName = getUserName(); // 動態獲取
textView.setText(label + dynamicName);
在 strings.xml 中定義格式化字符串:
<string name="user_name_format">用戶名:%1$s</string>
<string name="balance_format">餘額:¥%1$.2f</string>
<string name="status_format">狀態:%1$s</string>
代碼中調用:
// 字符串
textView.setText(getString(R.string.user_name_format, userName));
// 浮點數保留兩位小數
textView.setText(getString(R.string.balance_format, balance));
// 多參數
String multiFormat = getString(R.string.user_info_format, name, age, city);
若靜態文本與動態數據需要不同顏色、字體大小、粗細等樣式:
SpannableStringBuilder builder = new SpannableStringBuilder();
// 靜態標籤:灰色、正常字體
String label = "用戶名:";
SpannableString labelSpan = new SpannableString(label);
labelSpan.setSpan(new ForegroundColorSpan(Color.GRAY), 0, label.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
labelSpan.setSpan(new RelativeSizeSpan(0.9f), 0, label.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.append(labelSpan);
// 動態值:黑色、加粗、大一號
String value = "張三";
SpannableString valueSpan = new SpannableString(value);
valueSpan.setSpan(new ForegroundColorSpan(Color.BLACK), 0, value.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
valueSpan.setSpan(new StyleSpan(Typeface.BOLD), 0, value.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
valueSpan.setSpan(new RelativeSizeSpan(1.1f), 0, value.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.append(valueSpan);
textView.setText(builder);
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="用戶名:"
android:textColor="#999999" />
<TextView
android:id="@+id/tv_value"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000000"
android:textStyle="bold" />
</LinearLayout>
代碼中:tvValue.setText(userName);
| 方案 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| 字符串拼接 | 簡單臨時需求 | 代碼簡單 | 不支持國際化、樣式難控制 |
| strings.xml 佔位符 | 多語言、純文本混合 | 支持國際化、易維護 | 無法區分樣式 |
| SpannableString | 需區分樣式(顏色、大小、粗體) | 靈活控制富文本 | 代碼較繁瑣 |
| 多 TextView 佈局 | 樣式固定、復用率高 | XML 可視化、性能好 | 佈局層級深、需 findViewById |
strings.xml 佔位符,兼顧國際化與維護性。setRichText(label, value, labelStyle, valueStyle) 簡化 SpannableString 操作。TextView 組合,利用 ConstraintLayout 扁平化層級。onDraw 或頻繁調用的邏輯中創建大量 Spannable 對象,注意性能。