#android #android-layout
Вопрос:
Я реализовал окно системного оповещения, и у этого окна есть свой собственный пользовательский интерфейс. Но когда включен темный режим, то этот макет переопределяет цвета, которые я дал.
private fun showAlert(context: Context,message:String){ val builder: AlertDialog.Builder = AlertDialog.Builder( ContextThemeWrapper(context, R.style.RigTheme)) val inflater: LayoutInflater = LayoutInflater.from(context) val dialogView: View = inflater.inflate(R.layout.layout_rig_alert, null) dialogView.findViewByIdlt;TextViewgt;(R.id.tvMessage).text = message builder.setView(dialogView) val alert: AlertDialog = builder.create() val window = alert.window ?: return window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) window.requestFeature(Window.FEATURE_NO_TITLE) val layoutFlag: Int = if (Build.VERSION.SDK_INT gt;= Build.VERSION_CODES.O) { WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY } else { WindowManager.LayoutParams.TYPE_PHONE } window.setType(layoutFlag) alert.setCanceledOnTouchOutside(false) alert.show() val lp: WindowManager.LayoutParams = WindowManager.LayoutParams() window.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) window.setGravity(Gravity.CENTER) lp.copyFrom(window.attributes) //This makes the dialog take up the full width //This makes the dialog take up the full width lp.width = WindowManager.LayoutParams.WRAP_CONTENT lp.height = WindowManager.LayoutParams.WRAP_CONTENT window.attributes = lp // Click stuff }
И стиль
lt;style name="RigTheme" parent="Theme.AppCompat.Light.Dialog.Alert"gt; lt;item name="colorAccent"gt;@color/light_redlt;/itemgt; lt;item name="android:background"gt;@color/whitelt;/itemgt; lt;item name="android:textColorPrimary"gt;@color/txt_greylt;/itemgt; lt;item name="android:windowBackground"gt;@android:color/transparentlt;/itemgt; lt;item name="android:windowIsTranslucent"gt;truelt;/itemgt; lt;/stylegt;
расположение
lt;?xml version="1.0" encoding="utf-8"?gt; lt;androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="wrap_content" app:cardElevation="10dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"gt; lt;androidx.constraintlayout.widget.ConstraintLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/curve_bg" android:padding="10dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"gt; lt;ImageView android:id="@ id/iv_close" android:layout_width="24dp" android:layout_height="24dp" android:src="@drawable/close" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /gt; lt;TextView android:id="@ id/tvTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/warning" android:textColor="@color/light_red" android:textSize="30sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@ id/iv_close" /gt; lt;TextView android:id="@ id/tvMessage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:padding="20dp" android:textColor="@color/txt_grey" android:textSize="18sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@ id/tvTitle" /gt; lt;Button android:id="@ id/btnCancel" android:layout_width="100dp" android:layout_height="40dp" android:layout_marginStart="16dp" android:layout_marginEnd="16dp" android:background="@drawable/button_rect_un_selected" android:text="@string/cancel" android:textAllCaps="false" android:textColor="@color/txt_grey" app:layout_constraintEnd_toStartOf="@ id/btnDoit" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/tvMessage" /gt; lt;Button android:id="@ id/btnDoit" android:layout_width="100dp" android:layout_height="40dp" android:layout_marginStart="16dp" android:layout_marginEnd="16dp" android:background="@drawable/button_rect_selected" android:text="@string/do_it_now" android:textAllCaps="false" android:textColor="@color/white" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@ id/btnCancel" app:layout_constraintTop_toBottomOf="@id/tvMessage" /gt; lt;/androidx.constraintlayout.widget.ConstraintLayoutgt; lt;/androidx.cardview.widget.CardViewgt;
I have 2 issues with this code.
Issue 1
The dark mode is overriding the colour combination
Выпуск 2
Мне нужно выровнять виджеты по центру. Я дал WRAP_CONTENT, но диалоговое окно занимает большую часть ширины экрана. и, конечно же, виджеты выровнены по левому краю.
Ответ №1:
проверьте этот совет в документах:
Совет: Если вам нужен пользовательский диалог, вы можете вместо этого отображать действие как диалоговое окно, а не использовать диалоговые интерфейсы API. Просто создайте действие и установите его тему на Theme.Holo.Диалоговое окно в элементе манифеста:
lt;activity android:theme="@android:style/Theme.Holo.Dialog" gt;
Это оно. Действие теперь отображается в диалоговом окне, а не в полноэкранном режиме.
Я не пробовал, но я думаю, что внутри действия будет проще размещать ваши взгляды без проблем с выравниванием, также вы можете указать легкую тему с помощью Theme.Holo.Свет.Диалог.