如何修改ListPreference弹出对话框中负按钮的文字颜色
解决方案
方案1:自定义ListPreference子类(最精准,完全不影响其他组件)
这个方案只会修改你指定的ListPreference弹出对话框的负按钮颜色,其余所有组件、对话框样式都不会受影响:
- 新建自定义类继承ListPreference,重写对话框准备逻辑,在对话框显示时修改负按钮文字颜色:
// Kotlin 实现 class CustomListPreference @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null ) : ListPreference(context, attrs) { override fun onPrepareDialogBuilder(builder: AlertDialog.Builder) { super.onPrepareDialogBuilder(builder) builder.setOnShowListener { dialogInterface -> val alertDialog = dialogInterface as AlertDialog // 仅修改负按钮文字颜色 alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE) .setTextColor(context.getColor(R.color.你需要的颜色资源id)) } } }
// Java 实现 public class CustomListPreference extends ListPreference { public CustomListPreference(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { super.onPrepareDialogBuilder(builder); builder.setOnShowListener(dialogInterface -> { AlertDialog alertDialog = (AlertDialog) dialogInterface; alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE) .setTextColor(getContext().getColor(R.color.你需要的颜色资源id)); }); } }
- 修改你的Preference布局XML文件,把原来的
<ListPreference>标签替换为自定义类的全路径:
<com.yourproject.packagename.CustomListPreference android:key="你的设置项key" android:title="设置项名称" android:entries="@array/选项文字数组" android:entryValues="@array/选项值数组" />
方案2:自定义主题样式修改(适配多个ListPreference场景)
如果需要修改当前PreferenceFragment下所有ListPreference的负按钮颜色,又不想影响其他页面的对话框,可以用这个方案:
- 在
res/values/styles.xml中定义专属对话框样式:
<!-- Material主题适配 --> <style name="ListPrefDialogStyle" parent="Theme.MaterialComponents.DayNight.Dialog.Alert"> <item name="buttonNegativeTextColor">@color/你需要的颜色</item> </style> <!-- AppCompat旧主题适配 --> <style name="ListPrefDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert"> <item name="colorControlNegative">@color/你需要的颜色</item> </style>
- 在你的PreferenceFragment的
onCreate方法中,加载布局前给当前Fragment单独应用该主题,不会影响全局:
// Kotlin 代码 override fun onCreate(savedInstanceState: Bundle?) { requireContext().theme.applyStyle(R.style.ListPrefDialogStyle, true) super.onCreate(savedInstanceState) // 原有加载Preference的逻辑 addPreferencesFromResource(R.xml.你的preference布局文件) }
// Java 代码 @Override public void onCreate(Bundle savedInstanceState) { requireContext().getTheme().applyStyle(R.style.ListPrefDialogStyle, true); super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.你的preference布局文件); }
内容的提问来源于stack exchange,提问作者perun_the_mighty
相关产品推荐
相关产品推荐

