Dialog 是不是有可能在 Android 中同时使用圆角和 DayNight 主题的组合?

Posted

技术标签:

【中文标题】Dialog 是不是有可能在 Android 中同时使用圆角和 DayNight 主题的组合?【英文标题】:Is it possible that Dialog can works with combitation of rounded corners and DayNight theme at same time in Android?Dialog 是否有可能在 Android 中同时使用圆角和 DayNight 主题的组合? 【发布时间】:2020-01-21 05:10:11 【问题描述】:

当前更新:仍未解决!

问题: Dialog/AlertDialog/AlertDialogBu​​ilder/MaterialAlaertDialogBu​​ilder 是否可以在 android 中同时使用圆角和 DayNight 主题的组合?

我累了很多,但我不认为这是可能的。只有一件事会奏效。

你可以建议我使用材料库。

主题风格的圆角真的可以在Dialog中实现吗?

代码:

public void showFeedbackDialog(int code) 
        exitCode = code;
        dialog = new Dialog(context, R.style.dialogBoxStyle);

        View dialogView = LayoutInflater.from(context).inflate(R.layout.row_feedback_dialog, null);
        name = dialogView.findViewById(R.id.feedback_name);
        email = dialogView.findViewById(R.id.feedback_email);
        content = dialogView.findViewById(R.id.feedback_content);
        TextView nameError = dialogView.findViewById(R.id.nameError);
        emailError = dialogView.findViewById(R.id.emailError);
        feedbackError = dialogView.findViewById(R.id.feedbackError);
        progressBar = dialogView.findViewById(R.id.progress_bar);
        skip = dialogView.findViewById(R.id.skip);
        submit = dialogView.findViewById(R.id.button_positive);
        cancel = dialogView.findViewById(R.id.button_negative);

        dialog.setContentView(dialogView);

        if (code == 101) 
            skip.setVisibility(View.VISIBLE);
         else if (code == 102) 
            skip.setVisibility(View.GONE);
        
        dialog.setOnShowListener(new DialogInterface.OnShowListener() 
            @Override
            public void onShow(DialogInterface dialog) 
                submit.setOnClickListener(new View.OnClickListener() 
                    @Override
                    public void onClick(View v) 
                        if (checkValidation()) 
                            addFeedbackData();
                        
                    
                );

                cancel.setOnClickListener(new View.OnClickListener() 
                    @Override
                    public void onClick(View v) 
                        dialog.dismiss();
                    
                );

                skip.setOnClickListener(new View.OnClickListener() 
                    @Override
                    public void onClick(View v) 
                        if (code == 101) 
                            FeedbackDialog.this.dialog.dismiss();
                            FixedCategorySingleton.getInstance().setNullObject();
                            activity.finishAffinity();
                        
                    
                );
            
        );


        dialog.setCancelable(false);
        dialog.show();
        dialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));

    

row_feedback_dialog

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:focusableInTouchMode="true"
    android:background="@drawable/dialog_positive_round"
    app:cardCornerRadius="12dp"
    android:orientation="vertical">

    <include
        layout="@layout/row_progress_bar"
        android:visibility="gone" />

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="vertical"
        android:padding="10dp">


        <TextView
            style="@style/dialog_hint_textview_style"
            android:text="Please share your Feedback"/>
        <LinearLayout
            android:layout_
            android:layout_
            android:orientation="vertical">
            <TextView
                style="@style/hint_textview_style"
                android:text="@string/name" />
            <EditText
                android:id="@+id/feedback_name"
                style="@style/edit_text_style"
                android:singleLine="true"
                android:imeOptions="actionNext" />

        </LinearLayout>
        <include
            android:id="@+id/nameError"
            layout="@layout/row_error_textview" />

       <!-- <EditText
            android:id="@+id/feedback_name"
            android:layout_
            android:layout_
            android:backgroundTint="@color/colorIconLightGray"
            android:hint="Name (Optional)"
            android:inputType="textPersonName"
            android:textColor="?attr/textcolor" />-->



        <LinearLayout
            android:layout_
            android:layout_
            android:orientation="vertical">
            <TextView
                style="@style/hint_textview_style"
                android:text="@string/email" />
            <EditText
                android:id="@+id/feedback_email"
                style="@style/edit_text_style"
                android:singleLine="true"
                android:imeOptions="actionNext" />

        </LinearLayout>
        <include
            android:id="@+id/emailError"
            layout="@layout/row_error_textview" />

       <!-- <EditText
            android:id="@+id/feedback_email"
            android:layout_
            android:layout_
            android:backgroundTint="@color/colorIconLightGray"
            android:hint="Email (Optional)"
            android:inputType="textEmailAddress"
            android:textColor="?attr/textcolor" />-->


        <LinearLayout
            android:layout_
            android:layout_
            android:orientation="vertical">
            <TextView
                style="@style/hint_textview_style"
                android:text="What would you like to tell us?" />
            <EditText
                android:id="@+id/feedback_content"
                style="@style/edit_text_style"
                android:maxLines="4"
                android:imeOptions="actionDone" />
        </LinearLayout>


       <!-- <EditText
            android:id="@+id/feedback_content"
            android:layout_
            android:layout_
            android:backgroundTint="@color/colorIconLightGray"
            android:gravity="top"
            android:hint="What would you like to tell us?"
            android:imeOptions="actionDone"
            android:inputType="textMultiLine"
            android:lines="5"
            android:textColor="?attr/textcolor" />-->

        <include
            android:id="@+id/feedbackError"
            layout="@layout/row_error_textview" />

        <RelativeLayout
            android:layout_
            android:layout_
            android:background="?attr/backgroundcolor">


            <RelativeLayout
                android:layout_
                android:layout_
                android:orientation="horizontal">

                <LinearLayout
                    android:layout_
                    android:layout_
                    android:orientation="horizontal">

                    <Button
                        android:id="@+id/skip"
                        android:layout_
                        android:layout_
                        android:background="?attr/backgroundcolor"
                        android:text="@string/skip_caps"
                        android:textColor="?attr/textcolor"
                        android:visibility="gone" />
                </LinearLayout>

                <LinearLayout
                    android:layout_
                    android:layout_
                    android:layout_alignParentRight="true"
                    android:orientation="horizontal">

                    <Button
                        android:id="@+id/button_negative"
                        android:layout_
                        android:layout_
                        android:background="?attr/backgroundcolor"
                        android:text="@string/cancel"
                        android:textColor="?attr/textcolor" />

                    <Button
                        android:id="@+id/button_positive"
                        android:layout_
                        android:layout_
                        android:background="?attr/backgroundcolor"
                        android:text="@string/submit"
                        android:textColor="?attr/textcolor" />
                </LinearLayout>


            </RelativeLayout>
        </RelativeLayout>
    </LinearLayout>

</androidx.cardview.widget.CardView>

风格

  <style name="dialogBoxStyle" parent="Theme.AppCompat.DayNight.Dialog.Alert">
        <item name="android:background">?attr/backgroundcolor</item>
        <item name="android:textColor">?attr/textcolor</item>
        <item name="android:textColorAlertDialogListItem">?attr/textcolor</item>
        <item name="android:textColorSecondary">?attr/textcolor</item>
        <item name="android:textColorPrimary">?attr/textcolor</item>
        <item name="colorAccent">?attr/textcolor</item>
        <item name="android:typeface">normal</item>
        <item name="textColorAlertDialogListItem">?attr/textcolor</item>
    </style>

如果我不使用主题,那么一切都会正常工作。由于 getWindow 线,角落呈圆形。 但是,在我的应用中,我也在使用主题。

我请求你帮助我,我终于创建了这个帐户,因为我需要解决方案。

更新:

用素材库试过了,没有效果

【问题讨论】:

您到底需要什么?带主题的圆角?你的输出是什么? ***.com/a/57843956/7666442 @yes 带主题的圆角?,但我无法更改主题内的内容。 @Piyush 是的,带主题的圆角 检查this 【参考方案1】:

您可以使用Material Components library 中包含的MaterialAlertDialogBuilder。 使用方法.setView(R.layout.dialog_layout) 来扩充您的自定义布局。

类似:

 new MaterialAlertDialogBuilder(MainActivity.this,
            R.style.MyThemeOverlay_MaterialComponents_MaterialAlertDialog)
              .setTitle("Dialog")
              .setView(R.layout.dialog_layout)
              .setPositiveButton("Ok", null)
              .setNegativeButton("Skip", null)
              .show();

然后使用 shapeAppearanceOverlay 定义您的形状并应用圆角(需要 v.1.1.0)。

 <!-- Alert Dialog -->
  <style name="MyThemeOverlay.MaterialComponents.MaterialAlertDialog" parent="@style/ThemeOverlay.MaterialComponents.MaterialAlertDialog">
    <item name="shapeAppearanceOverlay">@style/ShapeAppearanceOverlay.MyApp.Dialog.Rounded</item>
    <item name="buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
    ...
  </style>


  <style name="PositiveButtonStyle" parent="@style/Widget.MaterialComponents.Button.TextButton.Dialog">
    <item name="android:textColor">#FFFFFF</item>
    <item name="backgroundTint">#00f</item>
  </style>

  <!-- Rounded corners -->
  <style name="ShapeAppearanceOverlay.MyApp.Dialog.Rounded" parent="">
    <item name="cornerFamily">rounded</item>
    <item name="cornerSize">16dp</item>
  </style>

您还可以使用属性 materialThemeOverlay 覆盖在您的应用主题中定义的默认样式/颜色,而无需为所有组件更改它。

类似:

<style name="MyThemeOverlay.MaterialComponents.MaterialAlertDialog" parent="@style/ThemeOverlay.MaterialComponents.MaterialAlertDialog">
    <item name="materialThemeOverlay">@style/MyAlThemeOverlay</item>
    ...
</style>

  <style name="MyAlThemeOverlay" parent="ThemeOverlay.MaterialComponents.TextInputEditText.FilledBox">
    <item name="colorPrimary">@color/....</item>
  </style>

材质组件库也支持DayNight theme。 您的应用主题必须继承自 Theme.MaterialComponents.DayNight

类似:

<style name="Theme.MyApp" parent="Theme.MaterialComponents.DayNight">
    <!-- ... -->
</style>

或:

res/values/themes.xml:

<style name="Theme.MyApp" parent="Theme.MaterialComponents.Light">
    <!-- ...  -->
</style>

res/values-night/themes.xml:

<style name="Theme.MyApp" parent="Theme.MaterialComponents">
    <!-- ... -->
</style>

在不更改代码的情况下,AlertDialog 继承自应用主题。

【讨论】:

它是否适用于昼夜主题而不使用手动 if/else 条件并且无需为昼夜创建单独的样式? @PriyankaSingh 是的。 Material Components 库支持DayNight theme。 @PriyankaSingh 刚试过。 AlertDialog 完全支持 DayNight 主题,无需对代码进行任何更改。答案已更新。 首先你需要使用Material Theme in your App theme(不是AppCompat)。然后检查MaterialAlertDialog的构造函数(如果不想全局更改则必须传递样式)然后检查shapeAppearanceOverlay属性(使用最新的1.1.0-alpha10)。 请清除我:我应该使用带有警报对话框的 MaterialAlertDialogBu​​ilder,因为我想在 showListener 上显示三个按钮。主题和圆角也都可以吗?如果是,请根据我的问题更改您的答案,因为刚才我尝试使用 MaterialAlertDialogBu​​ilder 替换我的代码,主题和圆角都没有给我效果。请帮忙,让我接受你的回答。

以上是关于Dialog 是不是有可能在 Android 中同时使用圆角和 DayNight 主题的组合?的主要内容,如果未能解决你的问题,请参考以下文章

优化自定义Dialog的弹出速度

android循环遍历出多个全屏的dialog,这些dialog怎么关闭

android怎样自定义dialog

Android 全局弹窗(Dialog)快速实现

Android开发实战之底部Dialog弹出效果

如何在Android中判断软键盘是不是弹出或隐藏