在 Android 對話框中直接使用 ListView 並設置 ArrayAdapter 時,若對話框主題為深色,列表項文字可能變為黑色導致在深色背景上不可見。
Dialog dialog = new Dialog(this);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("選擇模式");
ListView modeList = new ListView(this);
String[] items = {"明亮模式", "普通模式"};
ArrayAdapter<String> adapter = new ArrayAdapter<>(
this,
android.R.layout.simple_list_item_1,
android.R.id.text1,
items
);
modeList.setAdapter(adapter);
// ... 設置到對話框
android.R.layout.simple_list_item_1 的 TextView 文字顏色受主題影響AlertDialog.Builder 會自動處理主題適配,直接 new Dialog() 則不會new AlertDialog.Builder(this)
.setTitle("選擇模式")
.setSingleChoiceItems(items, -1, (dialog, which) -> {
// 處理選擇
dialog.dismiss();
})
.show();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
this,
android.R.layout.simple_list_item_1,
android.R.id.text1,
items
) {
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View view = super.getView(position, convertView, parent);
TextView textView = view.findViewById(android.R.id.text1);
if (textView != null) {
textView.setTextColor(Color.BLACK); // 或 Color.WHITE 視背景而定
// 也可設置背景
// view.setBackgroundColor(Color.WHITE);
}
return view;
}
};
res/layout/dialog_list_item.xml:
<TextView xmlns:android="https://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:textColor="#000000"
android:textSize="16sp"
android:background="#FFFFFF" />
使用:
ArrayAdapter<String> adapter = new ArrayAdapter<>(
this, R.layout.dialog_list_item, R.id.text1, items);
new AlertDialog.Builder(this, AlertDialog.THEME_DEVICE_DEFAULT_LIGHT)
.setTitle("標題")
.setAdapter(adapter, listener)
.show();
AlertDialog.Builder 而非手動構建 Dialog + ListViewsetSingleChoiceItems 或 setItems