Возможно ли, что Dialog может одновременно работать с комбинацией закругленных углов и темой DayNight в Android?

ТЕКУЩЕЕ ОБНОВЛЕНИЕ: проблема еще не решена!

Вопрос. Возможно ли, что Dialog/AlertDialog/AlertDialogBuilder/MaterialAlaertDialogBuilder может одновременно работать с комбинацией закругленных углов и темой DayNight в Android?

Я сильно устал, но не думаю, что это возможно. Только одно будет работать.

Вы можете предложить мне использовать библиотеку материалов.

Закругленный угол со стилем темы действительно возможен в 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_width="match_parent"
    android:layout_height="wrap_content"
    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_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="10dp">


        <TextView
            style="@style/dialog_hint_textview_style"
            android:text="Please share your Feedback"/>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            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_width="match_parent"
            android:layout_height="wrap_content"
            android:backgroundTint="@color/colorIconLightGray"
            android:hint="Name (Optional)"
            android:inputType="textPersonName"
            android:textColor="?attr/textcolor" />-->



        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            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_width="match_parent"
            android:layout_height="wrap_content"
            android:backgroundTint="@color/colorIconLightGray"
            android:hint="Email (Optional)"
            android:inputType="textEmailAddress"
            android:textColor="?attr/textcolor" />-->


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            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_width="match_parent"
            android:layout_height="wrap_content"
            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_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="?attr/backgroundcolor">


            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <LinearLayout
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal">

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

                <LinearLayout
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentRight="true"
                    android:orientation="horizontal">

                    <Button
                        android:id="@+id/button_negative"
                        android:layout_width="70dp"
                        android:layout_height="40dp"
                        android:background="?attr/backgroundcolor"
                        android:text="@string/cancel"
                        android:textColor="?attr/textcolor" />

                    <Button
                        android:id="@+id/button_positive"
                        android:layout_width="70dp"
                        android:layout_height="40dp"
                        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. Но в моем приложении я также использую тему.

Я прошу вас помочь мне, я наконец создал эту учетную запись, потому что мне нужно решение.

ОБНОВЛЕНИЕ:

пробовал с библиотекой материалов, не дал никакого эффекта


comment
Что именно вам нужно? Круглый угол с темой? Каков ваш результат?   -  person Piyush    schedule 20.09.2019
comment
stackoverflow.com/a/57843956/7666442   -  person AskNilesh    schedule 20.09.2019
comment
@yes Круглый угол с темой?, но я не могу изменить то, что находится внутри темы.   -  person Priyanka Singh    schedule 20.09.2019
comment
@Piyush да, закругленный угол с темой   -  person Priyanka Singh    schedule 20.09.2019
comment
Проверьте это   -  person Piyush    schedule 20.09.2019
comment
@NileshRathod, я проверил эту ссылку. но я использовал очень много свойств textColor, textColorSecondary и все. Так будет работать так же?   -  person Priyanka Singh    schedule 20.09.2019
comment
@ПриянкаСингх Да. Он также может настроить цвета с помощью цветов. Проверьте это   -  person Gabriele Mariotti    schedule 20.09.2019
comment
@Piyush, в этом примере родитель другой, он не работает с темой. Я пробовал.   -  person Priyanka Singh    schedule 20.09.2019
comment
попробуйте это: сделайте xml-файл округлой формы и эту строку кода dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));   -  person Viral Patel    schedule 20.09.2019
comment
@ViralPatel Уже пробовал. проблема заключается в том, что когда я добавляю стиль, родительским элементом которого является (Theme.AppCompat.DayNight.Dialog.Alert), это изменяет закругленный угол на квадратный.   -  person Priyanka Singh    schedule 20.09.2019
comment
используйте MaterialAlertDialogBuilder из библиотеки материалов. Я предполагаю, что для этого вам нужно использовать MaterialThemes в качестве темы по умолчанию. github.com/material-components/ материальные компоненты-android/blob/   -  person Pemba Tamang    schedule 20.09.2019
comment
Если вы все еще хотите использовать свой собственный фон, вам нужно установить атрибут windowBackgound, чтобы он работал.   -  person Pemba Tamang    schedule 20.09.2019
comment
@PembaTamang Уважаемый, я не хочу использовать библиотеку в своем проекте. И как я могу установить атрибут windowBackgound?   -  person Priyanka Singh    schedule 20.09.2019
comment
Поделитесь своим выходным снимком   -  person Piyush    schedule 20.09.2019
comment
это новая библиотека материалов от Google material.io/develop/android/docs/getting -started windowbackgound задается в стилях stackoverflow.com/a/23207466/8528047   -  person Pemba Tamang    schedule 20.09.2019
comment
@Piyush подожди я отправлю   -  person Priyanka Singh    schedule 20.09.2019
comment
проверьте это: journaldev.com/19352/android-daynight-theme- ночной режим   -  person Viral Patel    schedule 20.09.2019
comment
@Piyush photos.app.goo.gl/GDqVNDzoFC2AHgH38   -  person Priyanka Singh    schedule 20.09.2019
comment
@ViralPatel Дорогой, я знаю, как работать с темой. Я внимательно проверил вашу тему. Нет такого сочетания со скругленными углами и темой день-ночь.   -  person Priyanka Singh    schedule 20.09.2019


Ответы (1)


Вы можете использовать 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, чтобы задать форму и применить закругленные углы (требуется версия 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>

Также библиотека компонентов материалов поддерживает < strong>Тема DayNight.
Тема вашего приложения должна быть унаследована от Theme.MaterialComponents.DayNight.

Что-то типа:

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

or:

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 наследуется от темы приложения.

person Gabriele Mariotti    schedule 20.09.2019
comment
будет ли он работать для темы «день-ночь» без использования условия if/else вручную и без необходимости создавать отдельные стили для дня и ночи? - person Priyanka Singh; 20.09.2019
comment
@ПриянкаСингх Да. Библиотека компонентов материалов поддерживает тему DayNight< /а>. - person Gabriele Mariotti; 20.09.2019
comment
@PriyankaSingh Только что попробовал. AlertDialog имеет полную поддержку темы DayNight без каких-либо изменений в коде. Ответ обновлен. - person Gabriele Mariotti; 20.09.2019
comment
Прежде всего вам нужно использовать Material Theme в теме вашего приложения (не AppCompat). Затем проверьте конструктор MaterialAlertDialog (вам нужно передать стиль, если вы не хотите изменять его глобально), а затем проверьте атрибут shapeAppearanceOverlay (используйте последнюю версию 1.1.0-alpha10). - person Gabriele Mariotti; 20.09.2019
comment
Пожалуйста, проясните меня: должен ли я использовать MaterialAlertDialogBuilder с диалоговым окном предупреждения, потому что я хочу показать три кнопки с набором на showListener. Также будут работать тема и закругленные углы? если да, пожалуйста, измените свой ответ в соответствии с моим вопросом, потому что только что я попробовал и повторил свой код с помощью MaterialAlertDialogBuilder, тема и круглый угол не дают мне эффекта. Пожалуйста, помогите и позвольте мне принять ваш ответ. - person Priyanka Singh; 20.09.2019
comment
Я попытался выполнить ваш последний комментарий и также скопировал ваш код. пожалуйста, проверьте мой комментарий выше - person Priyanka Singh; 20.09.2019
comment
@PriyankaSingh MaterialAlertDialogBuilder поможет вам создать AlertDialog с помощью Material Theme и таких функций, как формирование. И да, он работает с темой приложения, и вы можете применить закругленные углы. (Например, попробуйте пустое приложение с очень простым диалоговым окном, подобным этому answer]. И библиотека Google по умолчанию поддерживает тему DayNight. - person Gabriele Mariotti; 20.09.2019