android-theme 相关问题

主题是应用于整个Android应用程序或Activity的样式,而不是单个View。将样式应用为主题时,“活动”或“应用程序”中的每个“视图”都将应用它支持的每个样式属性。

以编程方式更改 Android 11 (API 30) 中的状态栏文本颜色

我目前可以使用基本活动中的以下内容将状态栏文本颜色从浅色更新为深色: 私人乐趣toggleStatusBarTextColor(光:布尔值){ // 清除任何存在的...

回答 3 投票 0

以编程方式设置 android:windowIsTranslucent

按照本教程http://cases.azoft.com/android-tutorial-floating-activity/后,我能够创建浮动活动 但是,为此,我必须在 styles.xml 中添加这一行: 按照本教程后,我能够创建浮动活动http://cases.azoft.com/android-tutorial-floating-activity/ 但是,为此,我必须在 styles.xml 中添加这一行: <item name="android:windowIsTranslucent">true</item> 仅使用 Android/Java 代码是否可以达到相同的效果? (例如在 Activity.onAttachedToWindow() 左右...) 预先感谢您的帮助。 [编辑 01] styles.xml 不得更改(而且我不应该知道其中有什么......)。但出于测试目的,我使用默认的: <resources> <style name="AppBaseTheme" parent="Theme.AppCompat.Light"> </style> <style name="AppTheme" parent="AppBaseTheme"> </style> </resources> [编辑02]Resources.Theme.applyStyle()似乎做了我想做的事情(根据API描述:“将新属性值放入主题”)。 所以我创建了以下custom_style.xml: <resources> <style name="MyCustomStyle" > <item name="android:windowIsTranslucent">true</item> </style> </resources> 然后,在onAttachedToWindow(),我打电话: getTheme().applyStyle(R.style.MyCustomStyle, true); 但是没有任何效果... 仅使用Android/Java代码是否可以达到相同的效果? 恐怕不行。您只需在 styles.xml 内完成即可。据我所知 android:windowIsTranslucent 的值无法通过编程单独更改。 当我们调用 super.onCreate(savedInstanceState); 时,Activity 类提供了一个空的图形窗口,我们可以在其中设置内容,即视图。并将主题应用于该窗口,然后将内容加载到该视图上。 因此顺序将是, 致电super.onCreate() 设置活动主题。 设置该活动的内容视图。 例如。 styles.xml <style name="AppTheme" parent="AppBaseTheme"> <!-- All customizations that are NOT specific to a particular API-level can go here. --> <item name="android:windowBackground">@drawable/background</item> <item name="android:windowNoTitle">true</item> </style> <!-- Application theme.without title bar --> <style name="AppTheme.NoTitleBar" parent="AppBaseTheme"> <!-- All customizations that are NOT specific to a particular API-level can go here. --> <item name="android:windowBackground">@drawable/background</item> <item name="android:windowNoTitle">true</item> </style> <!--Floating activity theme --> <style name="Theme_Translucent" parent="android:style/Theme.NoTitleBar.Fullscreen"> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowFrame">@null</item> <item name="android:windowContentOverlay">@null</item> <item name="android:windowIsFloating">true</item> <item name="android:backgroundDimEnabled">true</item> <item name="android:windowIsTranslucent">true</item> <item name="android:windowNoTitle">true</item> <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item> <item name="android:windowFullscreen">true</item> </style> 然后为Floating activity设置主题,如下所示: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTheme(R.style.Theme_Translucent); // Set here setContentView(...) } 这样做 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window w = getWindow(); // in Activity's onCreate() for instance w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } Android R 出现新方法 不能说要以编程方式执行此操作..但如果您需要执行此操作,您可以像这样尝试.. 将主题添加到清单文件中的活动中,如下所示.. android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" 示例:- <activity android:name="com.example.androidhackerphonelocker.MainActivity" android:label="@string/app_name" android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> 希望它能解决您的一些问题.. 也许这会有所帮助。 @Override protected void onCreate(Bundle savedInstanceState) { processSetTheme(this); getWindow().requestFeature(Window.FEATURE_NO_TITLE); getWindow().setBackgroundDrawableResource(R.color.realTranslucent); if (Build.VERSION.SDK_INT>=19){ getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } super.onCreate(savedInstanceState); <color name="realTranslucent">#00000000</color> 如果 android.app.Dialog window.setDimAmount(0f) window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) 从 API 级别 30 开始,现在有一个 setTranslucent 方法: 将活动(尤其是具有 R.attr.windowIsTranslucent 或 R.attr.windowIsFloating 属性的活动)转换为全屏不透明活动,或将其从不透明转换回半透明。 文档

回答 7 投票 0

更改EditTextPreference的标题文本颜色

如何更改以下首选项 XML 中标题和摘要的颜色: 如何更改以下首选项 XML 中 title 和 summary 的颜色: <EditTextPreference android:key="username" android:title="Your Name" android:summary="Please provide your username." /> 我在我的styles.xml中尝试过这个: <style name="SettingsTheme" parent="@style/AppBaseTheme"> <item name="android:textColorPrimary">@color/green</item> <item name="android:textColorSecondary">@color/red</item> <item name="android:textColorTertiary">@color/blue</item> </style> textColorPrimary 更改标题的颜色,但它也会更改工具栏中文本的颜色(我不想要)。 textColorSecond 似乎正确地改变了摘要的颜色。 如何在不影响工具栏文本颜色的情况下更改标题颜色? 您需要像这样显式定义 EditTextPreference 的样式: <style name="SettingsTheme" parent="@style/AppBaseTheme"> <item name="android:editTextPreferenceStyle">@style/MyStyle</item> </style> <style name="MyStyle" parent="@android:style/Preference.DialogPreference.EditTextPreference"> ... </style> 这会将您在 MyStyle 中定义的任何样式仅设置为之前 EditTextPreference 默认样式的位置。 我最近也遇到了同样的问题。刚刚找到了答案。我制作了一个自定义的 EditTextPreference 并在我的代码中执行此操作来更改标题和摘要颜色,我还尝试更改图标色调(颜色)并且它正在工作,您所需要做的就是找到您需要更改的视图并应用您的视图修改如下: class MyEditTextPreference : EditTextPreference { constructor(context: Context) : super(context) constructor(context: Context, attr : AttributeSet?) : super(context, attr) constructor(context: Context, attr: AttributeSet?, i1: Int) : super(context, attr, i1) constructor(context: Context, attr: AttributeSet?, i1: Int, i2: Int) : super(context, attr, i1, i2) override fun onBindViewHolder(holder: PreferenceViewHolder) { super.onBindViewHolder(holder) (holder.findViewById(android.R.id.title) as TextView).setTextColor(Color.WHITE) (holder.findViewById(android.R.id.icon) as PreferenceImageView).imageTintList = ColorStateList.valueOf(Color.WHITE) (holder.findViewById(android.R.id.summary) as TextView).setTextColor(ResourcesCompat.getColor(context.resources, R.color.test_color, null)) } } 在你的 xml 文件中你必须使用这个 <mypackage.MyEditTextPreference app:icon="@drawable/ic_test" app:key="testKey" app:title="@string/testString" app:useSimpleSummaryProvider="true" /> 注1: 我使用了一个简单的摘要提供程序,但您可以使用您想要的任何摘要。 注2: 这些代码是用 kotlin 编写的,但您可以简单地将它们转换为 Java。 我认为最简单的方法是子类化 EditTextPreference 并在 onCreateView() 或 onBindView() 中调整标题颜色。 public class MyEditTextPreference extends EditTextPreference { // constructors omitted @Override protected void onBindView(View view) { TextView titleView = (TextView) view.findViewById(android.R.id.title); int color = getContext().getResources().getColor(R.color.preference_title); titleView.setTextColor(color); } } 然后在您的首选项 XML 中,您将使用您的类(完全限定名称): <com.package.MyEditTextPreference android:key="username" android:title="Your Name" android:summary="Please provide your username." />

回答 3 投票 0

如何从 jetpack compose 更改 OutlinedTextField 的轮廓颜色?

这是 OutlinedTextField 代码在 jetpack-compose 中的样子: 大纲文本字段( 值=“”, onValueChange = {}, 标签 = {文本(“输入”)} ) 默认颜色...

回答 7 投票 0

如何在 Jetpack Compose 中引用主题属性?

所以在当前的andriod开发中,如果我们需要引用主题中的颜色集,我们可以简单地这样做:(在layout xml中) .... 所以在目前的andriod开发中,如果我们需要引用主题中的某个颜色集,我们可以简单地这样做:(在layout xml中) .... <TextView ... android:textColor="?attr/colorPrimary" .../> .... 如果我在主题中设置蓝色。我将在上面的文本视图中获得该颜色。 我想知道如何在Jetpack Compose中做同样的事情。在 Compose,我们做到了, MaterialTheme(...) { Column { Text( ... textStyle = TextStyle(color = ????) // How to I reference to the theme? ) } } 你可以使用类似的东西: Text(text = "....", style = TextStyle(color = MaterialTheme.colors.primary)) Compose 提供基于 Material 颜色规范的 ColorPalette 来生成您的应用程序主题。它提供 lightColorPalette 和 darkColorPalette 分别用于定义浅色和深色模式的主题。 val lightThemeColors = lightColorPalette( primary = Color(0xFFFFFFFF), primaryVariant = Color(0xFFFFFFFF), onPrimary = Color.Black, secondary = Color.Transparent, onSecondary = Color.White, background = Color.White, onBackground = Color(0xFF212121), surface = Color.White, onSurface = Color(0xFF212121), error = Color.Red, onError = Color.White ) val darkThemeColors = darkColorPalette( primary = Color(0xFF000000), primaryVariant = Color(0xFF000000), onPrimary = Color.White, secondary = Color.White, onSecondary = Color.White, surface = Color(0xFF212121), background = Color(0xFF212121), onBackground = Color.White, onSurface = Color.White, error = Color.Red, onError = Color.White ) MaterialTheme( colors = if(isSystemInDarkTheme()) darkThemeColors else lightThemeColors ) { Column { Text( textStyle = TextStyle(color = MaterialTheme.colors.primary) ) } } 如果您想为主题添加更多自定义颜色,您可以使用 ColorPalette 和扩展变量,如下所示 @Composable val ColorPalette.myColor: Color get() = if(!isLight) Color(0xFF424242) else Color.White 现在您可以使用 MaterialTheme.colors.myColor 来包含。 如果您想包含来自 android 颜色 xml 的颜色,您可以使用 colorResource(id = R.color.anyName) 函数来实现。 为了从属性中获取颜色,我使用这个可组合函数: @Composable fun getColor(color: Int): Color { return colorResource(LocalContext.current.getColorFromAttrs(color).resourceId) } fun Context.getColorFromAttrs(attr: Int): TypedValue { return TypedValue().apply { theme.resolveAttribute(attr, this, true) } } 用途: val color: Color = getColor(R.attr.colorText) 你可以试试这个: inline fun <T> Resources.Theme.getAttribute( @AttrRes attr: Int, block: (TypedArray) -> T, ): T { val a = obtainStyledAttributes(intArrayOf(attr)) return block(a).also { a.recycle() } } fun Resources.Theme.getDrawableAttribute(@AttrRes attr: Int): Drawable = getAttribute(attr) { it.getDrawable(0)!! } fun Resources.Theme.getDimensionAttribute(@AttrRes attr: Int, defaultValue: Float = 0f): Float = getAttribute(attr) { it.getDimension(0, defaultValue) } fun Resources.Theme.getStringAttribute(@AttrRes attr: Int): String? = getAttribute(attr) { it.getString(0) } fun Resources.Theme.getColorAttribute(@AttrRes attr: Int, defaultValue: Int = 0): Int = getAttribute(attr) { it.getColor(0, defaultValue) } @Composable fun getDimensionAttribute(@AttrRes attr: Int, defaultValue: Float = 0f): Float = LocalContext.current.theme.getDimensionAttribute(attr, defaultValue) @Composable fun getStringAttribute(@AttrRes attr: Int): String? = LocalContext.current.theme.getStringAttribute(attr) @Composable fun getColorAttribute(@AttrRes attr: Int, defaultValue: Int = 0): Int = LocalContext.current.theme.getColorAttribute(attr, defaultValue) 如果您使用Material3,您将使用MaterialTheme.colorScheme: Text(text = "Example", style = TextStyle(color = MaterialTheme.colorScheme.primary))

回答 5 投票 0

如何制作自定义输入pin码Android?

我在 Kotlin Android 上制作项目。我怎样才能使相同的字段和相同的输入?在我看来,创建一些编辑文本并不是一个好的决定 在此输入图像描述 输入图像描述她...

回答 1 投票 0

Android 中父主题的含义

在 Android 中使用*主题对我来说一直很困难。我知道Android中有哪些主题和样式,但不知何故使用它们,我感觉有点痛苦。 例如我发现我的案例之一...

回答 1 投票 0

postSplashScreenTheme 在启动屏幕后不应用主题

按照Android文档(还有这个和这个)所示实现启动屏幕API后,启动活动(在启动屏幕之后立即进行)没有动态颜色主题

回答 1 投票 0

如何更改Light and Dark Material 3 Jetpack compose中的StatusBar颜色?

我提供了自己的颜色来更改应用程序中的状态栏颜色,但它在 Material 3 中不起作用。 以下是 Theme.kt 文件中默认的浅色和深色: 私人 val DarkColorScheme = darkColorScheme...

回答 1 投票 0

如何切换到深色主题?

我需要在应用程序中切换到深色主题,我这样做: 私人乐趣 onOffDarkTheme() { 如果(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){ 当(需要Acti...

回答 1 投票 0

如何在不改变当前主题的情况下实现Android闪屏API

我想将Android Splash Screen API添加到基于此文档已经开发的项目中,该项目有自己的样式和主题。在文档中它说应用程序中的主题...

回答 1 投票 0

如何以编程方式获取颜色属性的值

当我使用resolveAttribute()找出?attr/colorControlNormal的颜色值时,我得到236: TypedValue typedValue = new TypedValue(); getTheme().resolveAttribute(R.attr.colorControlNormal,

回答 4 投票 0

Chip:此组件上的样式要求您的应用程序主题为 Theme.MaterialComponents (或后代)

我想在我的项目中向 ChipGroup 添加一个 Chip 视图,但总是出现以下错误 我在活动中的代码 对于 (int i = 0; i < names.size(); i++) { Chip chip = new Chip(getApplicationContext()...

回答 1 投票 0

如何在 Compose 中首次重新组合之前更改应用程序主题?

我有可组合的主屏幕和设置屏幕。它们都共享一个共同的 ViewModel SettingsViewModel 负责读取和保存主题设置。 在 MainActivity 中,创建之前

回答 1 投票 0

Lollipop 下方的 Material Design 支持 - 崩溃

我一直在尝试按照这些说明实施 Material Design 主题。 我没有使用工具栏(必须吗?) 我所有的活动都扩展了 ActionBarActivity。 使用 getSupportActionBar() 所有 ...

回答 4 投票 0

Android TextInputLayout 和 TextInputEditText 光标颜色

我想更改光标(或插入符号)颜色,就像在这个堆栈溢出问题中一样,但是在材料 3 中。 我想更改光标(或插入符号)颜色,就像在这个堆栈溢出问题中一样,但是在 Material 3 中。 <com.google.android.material.textfield.TextInputLayout android:id="@+id/brands_input_layout" style="@style/Widget.Material3.TextInputLayout.FilledBox.ExposedDropdownMenu.Honk" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/size_medium" android:paddingEnd="44dp" android:theme="@style/Widget.Material3.TextInputLayout.FilledBox.ExposedDropdownMenu.Honk" app:layout_constraintEnd_toStartOf="@id/hide_show_brands_icon" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" tools:ignore="RtlSymmetry"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/description_input" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/colorPrimary" android:imeOptions="actionDone" android:inputType="textCapSentences" /> </com.google.android.material.textfield.TextInputLayout> 这是我的主题文件: <style name="Widget.Material3.TextInputLayout.FilledBox.ExposedDropdownMenu.Honk"> <item name="boxStrokeColor">@color/textDropdownBoxStrokeColor</item> <item name="hintTextColor">@color/textDropdownBoxStrokeColor</item> <item name="colorControlActivated">@color/textDropdownBoxStrokeColor</item> <item name="endIconTint">@color/dropdown_menu_arrow</item> </style> 我已经试过了: <style name="ThemeOverlay.SmartHabit.TextInputEditText.FilledBox.Dense" parent="ThemeOverlay.Material3.TextInputEditText.FilledBox.Dense"> <item name="colorControlActivated">@color/colorSecondary</item> </style> <com.google.android.material.textfield.TextInputEditText android:id="@+id/description_input" style="@style/ThemeOverlay.SmartHabit.TextInputEditText.FilledBox.Dense" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/colorPrimary" android:imeOptions="actionDone" android:inputType="textCapSentences" /> 我也已经试过了: <style name="ThemeOverlay.SmartHabit.TextInputEditText.FilledBox.Dense" parent="ThemeOverlay.Material3.TextInputEditText.FilledBox.Dense"> <item name="colorPrimary">@color/colorSecondary</item> </style> <com.google.android.material.textfield.TextInputEditText android:id="@+id/description_input" style="@style/ThemeOverlay.SmartHabit.TextInputEditText.FilledBox.Dense" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/colorPrimary" android:imeOptions="actionDone" android:inputType="textCapSentences" /> 编辑: 根据Material 3 Documentation,我已经尝试这样做了,但是没有用: <com.google.android.material.textfield.TextInputEditText android:id="@+id/description_input" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/colorPrimary" android:imeOptions="actionDone" android:inputType="textCapSentences" app:cursorColor="@color/myColor" />

回答 0 投票 0

如何通过 R.attr.colorPrimary 访问主题颜色属性

我正在使用 Android Studio Electric Eel,我开始了一个新的“基本活动”项目。它带有明暗主题,/res/values/theme.xml /res/values-night/theme.xml 我正在使用 Android Studio Electric Eel,我开始了一个新的“基本活动”项目。它带有明暗主题,/res/values/theme.xml /res/values-night/theme.xml <resources xmlns:tools="http://schemas.android.com/tools"> <style name="Theme.Example" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> <item name="colorPrimary">@color/md_theme_light_primary</item> </style> </resources> 我明白我需要使用这个代码: val typedValue = TypedValue() view.context.theme.resolveAttribute(R.attr.colorPrimary, typedValue, true) val colorPrimary = typedValue.data 这几乎行得通。 无论出于何种原因,R.attr.colorPrimary 都不会解决我本地项目的默认 com.example.project.R。当我输入R.attr.colorPrimary时,它只会自动完成解析为com.google.android.material.R.attr.colorPrimary(它也可以解析为一些androidx组件,这也有效) 当我使用它时,它确实有效,并且它确实使用了从我的 theme.xml 指向的我的 colors.xml。我只是想了解为什么它不会简单地从我的 theme.xml 中解析。在我在网上找到的所有示例中,它都被命名为 styles.xml,所以我将其重命名为那个,一切都一样,没有变化。 当我按住 ctrl 并单击已解析的颜色时,它会将我带到缓存文件中... ransformed ppcompat-1.6.1 es alues alues.xml 那是<attr format="color" name="colorPrimary"/> 如果我 ctrl-click parent="Theme.MaterialComponents.DayNight.DarkActionBar" 它会带我到一个缓存 ... ransformed\material-1.8.0 es 值 alues.xml 我只是想明白为什么。看来我的颜色仍然覆盖默认颜色,并且它可以使用com.google.android.material.R。在 xml 布局中,?attr/colorPrimary 工作得很好。但是我看的任何地方都没有说在以编程方式解决它时需要这条路径。 这几乎行得通。无论出于何种原因,R.attr.colorPrimary 都不会解析我本地项目的默认 com.example.project.R。 那是因为 colorPrimary 不是您在本地项目中定义的属性。这是材料库中定义的属性。 当我使用它时,它确实有效,并且它确实使用了从我的 theme.xml 指向的我的 colors.xml。我只是想了解为什么它不会简单地从我的 theme.xml 中解析。 属性不会“从 [your] theme.xml 解析”。属性在 attrs.xml 文件中定义,就像颜色或尺寸一样。你没有定义一个,因此它不存在。 当你在你的themes.xml文件中使用它时: <resources xmlns:tools="http://schemas.android.com/tools"> <style name="Theme.Example" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> <item name="colorPrimary">@color/md_theme_light_primary</item> </style> </resources> 您正在 extending 现有的材料主题(parent 属性)并设置已在该主题中定义的 colorPrimary 属性。您没有声明自己的 colorPrimary 属性。如果您没有将 parent 属性设置为具有 colorPrimary 的主题,则会出现错误。 在我在网上找到的所有示例中,它都被命名为 styles.xml,所以我将其重命名为那个,一切都一样,没有变化。 对 - 文件名无关紧要。 当我按住 ctrl 并单击已解析的颜色时,它会将我带到缓存文件中... ransformed ppcompat-1.6.1 es alues alues.xml 那是 如果我 ctrl-click the parent="Theme.MaterialComponents.DayNight.DarkActionBar" 它会带我到缓存 ... ransformed\material-1.8.0 es 值 alues.xml 通过 XML 的 Android 主题是一个复杂的嵌套覆盖网络。 colorPrimary 作为第一个“app compat”库中的 Material design 引入的概念。此后,它通过专用材料库进行了更新和增强,这些材料库扩展了原始材料并重新定义了值以遵守最新的材料指南。 我只是想明白为什么。看来我的颜色仍然会覆盖默认颜色,并且它可以使用 com.google.android.material.R 工作。在 xml 布局中 ?attr/colorPrimary 工作得很好。但是我看的任何地方都没有说在以编程方式解决它时需要这条路径。 总而言之,colorPrimary 是由 appcompat 和材料设计库定义的主题属性,因此它存在于它们的包中。 在 XML 中,?attr/colorPrimary 引用当前主题,在您的情况下将是“Theme.Example”,您已声明将 colorPrimary 设置为 @color/md_theme_light_primary. 但是,在代码中,colorPrimary 只是一个常量,必须解决以澄清 which colorPrimary 您所指的是所有已定义的内容。最终,您使用哪个包来访问代码中的colorPrimary并不重要 - 它的value将解析为您在主题中设置的内容。

回答 1 投票 0

当主题从暗色变为亮色或反之亦然时,重新加载活动。

我有一个作为新任务启动的活动,我想在onStop中调用finish()(以便将其从最近的应用程序列表中排除)。但是我注意到一个错误,当改变主题时,比如说从......

回答 1 投票 0

如何将App更新为(原生的)材质设计?

我看到谷歌更新了一些应用程序(如Hangout)到新的Material Design。我怎样才能做到这一点呢?我有一个Nexus 5(Android 4.4),但如果我在styles.xml中设置主题为 "android: style ...

回答 1 投票 1

当应用带有数据绑定的主题时,编译器错误。

我的代码为ColorBox对象的列表无限期地洗牌颜色和索引。这是我的观点。

回答 1 投票 1

© www.soinside.com 2019 - 2024. All rights reserved.