【问题标题】:Buttons colors issue in AlertDialog on Oreo 8.0Oreo 8.0 上的 AlertDialog 中的按钮颜色问题
【发布时间】:2018-05-07 12:07:08
【问题描述】:

我在仅 Android Oreo 8.0 上的 AlertDialogs 中的操作按钮、普通 AlertDilogs 或 PreferenceFragment 中的 AlertDialogs 中遇到问题,例如 EditTextPreference。

无论对话框类型或支持库的类型如何,问题都会出现在所有弹出窗口中

这是 API 23 中的 EditTextPreference 完美运行

这是 Android Oreo 8.0,按钮是隐藏的或白色的

这是我的样式文件

<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:windowContentTransitions">true</item>
    <item name="android:buttonStyle">@style/RoundedButtons</item>
    <item name="buttonStyle">@style/RoundedButtons</item>
    <item name="android:fontFamily">@font/roboto_regular</item>
    <item name="android:windowActionBarOverlay">true</item>
    <item name="android:dialogTheme">@style/DatePickerTheme</item>
</style>

<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light">
    <item name="android:background">@drawable/cuju_gradient_background</item>
</style>

<style name="RoundedButtons" parent="Widget.AppCompat.Button">
    <item name="android:background">@drawable/rounded_gradient_bg</item>
    <item name="android:padding">4dp</item>
    <item name="android:textSize">20sp</item>
    <item name="android:minHeight">48dp</item>
    <item name="android:textColor">@color/white</item>
    <item name="android:textAllCaps">false</item>
</style>

<style name="HollowButtons" parent="Widget.AppCompat.Button.Borderless.Colored">
    <item name="android:background">@drawable/rounded_hollow_botton</item>
    <item name="android:textColor">@android:color/white</item>
    <item name="android:textAllCaps">false</item>
</style>

<style name="HollowRegisterButtons" parent="Widget.AppCompat.Button.Borderless.Colored">
    <item name="android:background">@drawable/registration_hollow_botton</item>
    <item name="android:minHeight">56dp</item>
    <item name="android:textColor">@color/startColor</item>
    <item name="android:textAllCaps">false</item>
</style>

<style name="HollowButtonsLeaderBoard" parent="Widget.AppCompat.Button.Borderless.Colored">
    <item name="android:background">@drawable/rounded_hollow_leaderboard_botton</item>
    <item name="android:textColor">@color/colorPrimaryDark</item>
    <item name="android:paddingStart">20dp</item>
    <item name="android:paddingLeft">20dp</item>
    <item name="android:paddingEnd">20dp</item>
    <item name="android:paddingRight">20dp</item>
    <item name="android:maxHeight">36dp</item>
    <item name="android:maxButtonHeight">36dp</item>
    <item name="android:textSize">14sp</item>
    <item name="android:textAllCaps">false</item>
</style>


<style name="HollowButtonsTags" parent="Widget.AppCompat.Button.Borderless.Colored">
    <item name="android:background">@drawable/rounded_hollow_tags_button</item>
    <item name="android:textColor">@android:color/white</item>
    <item name="android:textAllCaps">false</item>

</style>

<style name="RegisterRoundedButtons" parent="Widget.AppCompat.Button">
    <item name="android:background">@drawable/white_rounded_rectangle</item>
    <item name="android:textColor">@android:color/black</item>
    <item name="android:paddingLeft">16dp</item>
    <item name="android:paddingRight">16dp</item>
    <item name="android:paddingStart">16dp</item>
    <item name="android:paddingEnd">16dp</item>
    <item name="android:textAllCaps">false</item>
</style>

<style name="NextButtons" parent="Widget.AppCompat.Button">
    <item name="android:background">@drawable/next_button</item>
    <item name="android:textColor">#ff4a4a4a</item>
    <item name="android:textAllCaps">false</item>
    <item name="android:textSize">17sp</item>
</style>

<style name="CoachButton" parent="Widget.AppCompat.Button">
    <item name="android:background">@drawable/white_rounded_rectangle</item>
    <item name="android:textColor">@color/black</item>
    <item name="android:textAllCaps">false</item>
    <item name="android:textSize">16sp</item>
</style>

<style name="CoachButtons1" parent="CoachButton">
    <item name="android:background">@drawable/yellow_rounded_rectangle</item>
</style>

<style name="CoachButtons2" parent="CoachButton">
    <item name="android:background">@drawable/green_rounded_rectangle</item>
</style>


<style name="RegisterText" parent="android:TextAppearance">
    <item name="android:textColor">@android:color/white</item>
    <item name="android:textSize">17sp</item>
    <item name="android:gravity">center</item>
    <item name="android:layout_gravity">center</item>
</style>

<style name="RegisterEditText" parent="Widget.AppCompat.EditText">
    <item name="android:textSize">15sp</item>
    <item name="android:background">@drawable/registration_edittext_selector</item>
    <item name="android:minHeight">56dp</item>
    <item name="android:paddingLeft">30dp</item>
    <item name="android:paddingRight">16dp</item>
    <item name="android:paddingTop">4dp</item>
    <item name="android:paddingBottom">4dp</item>
    <item name="android:textColor">@android:color/black</item>
    <item name="android:textColorHint">#FF9B9B9B</item>
</style>

<style name="cujuEditText" parent="Widget.AppCompat.EditText">
    <item name="android:textSize">15sp</item>
    <item name="android:background">@drawable/rounded_edittext</item>
    <item name="android:minHeight">48dp</item>
    <item name="android:paddingLeft">16dp</item>
    <item name="android:textColorHint">#8F8F8F</item>
    <item name="android:paddingRight">16dp</item>
    <item name="android:paddingTop">4dp</item>
    <item name="android:paddingBottom">4dp</item>
</style>

<style name="homeEditText" parent="Widget.AppCompat.EditText">
    <item name="android:textSize">15sp</item>
    <item name="android:background">@drawable/status_field</item>
    <item name="android:minHeight">48dp</item>
    <item name="android:paddingLeft">16dp</item>
    <item name="android:textColorHint">@color/black</item>
    <item name="android:paddingRight">16dp</item>
    <item name="android:paddingTop">4dp</item>
    <item name="android:paddingBottom">4dp</item>
</style>

<style name="RegisterAutoCompleteTextView" parent="Widget.AppCompat.AutoCompleteTextView">
    <item name="android:textSize">15sp</item>
    <item name="android:background">@drawable/registration_edittext_selector</item>
    <item name="android:minHeight">56dp</item>
    <item name="android:paddingLeft">30dp</item>
    <item name="android:paddingRight">16dp</item>
    <item name="android:paddingTop">4dp</item>
    <item name="android:paddingBottom">4dp</item>
    <item name="android:textColor">@android:color/black</item>
    <item name="android:textColorHint">#FF9B9B9B</item>
</style>

<style name="SeekBar" parent="Widget.AppCompat.SeekBar">
    <item name="android:thumb">@drawable/hype_cujuball</item>
    <item name="android:height">2dp</item>
    <item name="android:progressDrawable">@drawable/cuju_custom_seekbar</item>
    <item name="android:indeterminateOnly">false</item>
    <item name="android:splitTrack">false</item>
</style>

<style name="Spinner" parent="Widget.AppCompat.DropDownItem.Spinner">

</style>

<style name="my_facebook" parent="com_facebook_loginview_default_style">
    <item name="android:background">@drawable/facebook_rounded_botton</item>
    <item name="android:paddingBottom">16dp</item>
    <item name="android:paddingTop">16dp</item>
    <item name="android:textColor">@android:color/black</item>
    <item name="android:textSize">18sp</item>
</style>

<style name="Theme.AppCompat.Light.NoActionBar.FullScreen" parent="@style/Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowActionBar">false</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowContentOverlay">@null</item>
</style>

<style name="DatePickerTheme" parent="Theme.AppCompat.Light.Dialog">
    <item name="colorControlActivated">@color/colorPrimary</item>
    <item name="colorControlHighlight">@color/colorPrimary</item>
</style>

我应该在样式中写什么来解决问题?

【问题讨论】:

    标签: android android-alertdialog android-8.0-oreo


    【解决方案1】:

    我知道这不是您想要的答案,但是我曾经尝试调整系统警报对话框的样式,并且真的厌倦了尝试按照我想要的方式为我的应用程序调整样式,只是为了您的情况厌倦了寻找解决方案考虑编写您的自定义警报对话框并自己完成完整的布局:-)

    这是一个简单的标题、消息和两个按钮对话框的示例,您可以调整(此示例使用数据绑定):

    public class StyledAlertDialog {
    
        public static class Builder {
            private Context context;
            private String title;
            private String message;
            private int resPositiveButton;
            private DialogInterface.OnClickListener positiveListener;
            private int resNegativeButton;
            private DialogInterface.OnClickListener negativeListener;
            private boolean cancelable = true;
    
            public Builder(Context context) {
                this.context = context;
                // default value for cancel button
                this.resNegativeButton = R.string.button_cancel;
            }
    
            public Builder setTitle(int resTitle) {
                this.title = context.getString(resTitle);
                return this;
            }
    
            public Builder setTitle(String title) {
                this.title = title;
                return this;
            }
    
            public Builder setMessage(int resMessage) {
                this.message = context.getString(resMessage);
                return this;
            }
    
            public Builder setMessage(String message) {
                this.message = message;
                return this;
            }
    
            public Builder setPositiveButton(int resPositiveButton, DialogInterface.OnClickListener positiveListener) {
                this.resPositiveButton = resPositiveButton;
                this.positiveListener = positiveListener;
                return this;
            }
    
            public Builder setNegativeButton(int resNegativeButton, DialogInterface.OnClickListener negativeListener) {
                this.resNegativeButton = resNegativeButton;
                this.negativeListener = negativeListener;
                return this;
            }
    
            public Builder create() {
                return this;
            }
    
            public void setCancelable(boolean cancelable) {
                this.cancelable = cancelable;
            }
    
            public void show() {
                final AlertDialog alertDialog = new AlertDialog.Builder(context).create();
    
                LayoutInflater inflater = LayoutInflater.from(context);
                // In this special case null is the only valid choice as the root
                // of the alertDialog does not exist yet.
                View inflatedView = inflater.inflate(R.layout.dialog_styled_layout, null);
                DialogStyledLayoutBinding viewBinding = DialogStyledLayoutBinding.bind(inflatedView);
    
                if (title != null && title.length() > 0) {
                    viewBinding.customDialogTitle.setText(title);
                    viewBinding.customDialogTitle.setVisibility(View.VISIBLE);
                } else {
                    viewBinding.customDialogTitle.setVisibility(View.GONE);
                }
    
                viewBinding.customDialogMessage.setText(message);
    
                viewBinding.customPositiveButton.setText(resPositiveButton);
                viewBinding.customPositiveButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        alertDialog.hide();
                        if (positiveListener != null) {
                            positiveListener.onClick(alertDialog, 0);
                        }
                    }
                });
                viewBinding.customNegativeButton.setText(resNegativeButton);
                viewBinding.customNegativeButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        alertDialog.hide();
                        if (negativeListener != null) {
                            negativeListener.onClick(alertDialog, 0);
                        }
                    }
                });
    
                alertDialog.setCancelable(cancelable);
                alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
                alertDialog.setView(inflatedView, 40, 0, 40, 0);
                alertDialog.show();
            }
        }
    }
    

    【讨论】:

    • 感谢您的回答。我希望任何人都能找到适用于所有对话框的解决方案
    【解决方案2】:

    我找到了解决办法。

    原来Android Oreo 中AlertDialog 中的按钮以及后来扩展了应用程序默认按钮样式的按钮样式。

    <item name="buttonStyle">@style/RoundedButtons</item>
    
    <style name="RoundedButtons" parent="Widget.AppCompat.Button">
        <item name="android:background">@drawable/rounded_gradient_bg</item>
        <item name="android:padding">4dp</item>
        <item name="android:textSize">20sp</item>
        <item name="android:minHeight">48dp</item>
        <item name="android:textColor">@color/white</item>
        <item name="android:textAllCaps">false</item>
    </style>
    

    所以当我删除这一行时

    <item name="android:textColor">@color/white</item>
    

    它有效。

    【讨论】:

      猜你喜欢
      • 2011-05-04
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2020-01-01
      相关资源
      最近更新 更多