切换主题xamarin.android

问题描述 投票:0回答:2

我正在尝试使用Xamarin.Android创建一个应用程序,其中我有一个包含所有主题的RadioGroup。我正在尝试在检查组中的某个RadioButton时更改主题,但它似乎不起作用。有什么想法吗?

styles.xml

<resources>
<style name="LightTheme" parent="android:Theme.Material.Light.DarkActionBar">
  <item name="android:colorPrimary"> @color/blue</item>
  <item name="android:windowBackground"> @color/grey</item>
  <item name="android:colorAccent"> @color/yellow </item>
</style>

<style name="DarkTheme" parent="android:Theme.Material.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="android:colorPrimary"> @color/green </item>
    <item name="android:colorPrimaryDark"> @color/blue </item>
    <item name="android:colorAccent"> @color/purple </item>      
     <item name="android:windowBackground"> @color/dark_blue </item>
</style>
</resources>

layout.axml

<RadioGroup
    android:minWidth="25px"
    android:minHeight="25px"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/errorMsg"
    android:onClick ="Change"
    android:id="@+id/radGrp">
    <RadioButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:checked="true"
        android:text="Dark"
        android:id="@+id/radDark" />
    <RadioButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Light"
        android:id="@+id/radLight" />
</RadioGroup>

MainActivity.cs

RadioGroup radGrp = FindViewById<RadioGroup>(Resource.Id.radGrp);
radGrp.CheckedChange += Change;

 private void Change(object sender, RadioGroup.CheckedChangeEventArgs e)
    {
        try
        {
            switch (e.CheckedId)
            {
                case Resource.Id.radDark: this.SetTheme(Resource.Style.DarkTheme); break;
                case Resource.Id.radLight: this.SetTheme(Resource.Style.LightTheme); break;
            }

        }
        catch (Exception ex)
        {
            errMsg.Text = ex.Message;
        }
    }

我是否需要在AndroidManifest.xaml或[Activity(Label =“@ string / app_name”,Theme = ...,MainLauncher = true)]中更改某些内容?

c# xamarin.android
2个回答
0
投票

这是在Android上实现Themeing的方式的限制/功能。在活动运行OnResume之前,更改活动的主题实际上不会生效,因此您必须重新启动活动。您可以使用各种策略来最小化对用户的影响。 Xamarin实际上提供了一个示例Theme Switcher应用程序,它可能是实现某些东西的一个很好的参考:https://developer.xamarin.com/samples/monodroid/android5.0/ThemeSwitcher/


0
投票

Themes and Styling

样式化是一种机制,通过该机制,分配给属性/属性的值在外部定义,然后分配给对象,然后对象应用它们。这允许将单个样式定义应用于多个对象,而不必单独为每个对象定义每个属性值。

样式的使用可确保应用程序内部和跨应用程序的设计一致性,减少错误,并可节省大量工作。它允许开发人员快速应用整体视觉设计,并专注于开发应用程序的增值方面。

Android中的样式系统与Android生态系统紧密耦合,有些东西通过任何其他机制实现是不切实际的,读取一些你在代码中无法做到的事情,只使用样式系统:-(

Android样式是一个xml文件,它定义了一组属性/属性值。它可以针对单个类或多个类。因为它符合xml标准,所以当应用于该对象时,该对象将忽略与该对象无关的标记。

Android中的样式可以应用于应用程序,活动或对象级别。从技术角度来看,主题和样式是可以互换的。主题只是在应用程序或活动级别应用的样式。引用它们时应使用以下内容:

  • 样式:定义在类和/或对象级别应用的一组属性/属性。
  • 主题:定义在应用程序或活动级别应用的一组属性/属性。

通常,用作主题的样式将包含许多类的属性/属性的定义。

样式(以及主题)表现出继承性。 Style可以从其他样式继承,然后添加和/或修改属性/属性值。

样式(以及它们定义的属性/属性)也是分层应用的。在Android中,优先顺序为:

属性/属性直接应用于对象>覆盖>通过将样式应用于对象来设置属性/属性>覆盖>通过将主题(样式)应用于活动>覆盖>通过应用主题设置属性来设置属性(样式)到应用程序。

Android提供了许多预定义的样式,可用作主题。您可以按原样应用这些,也可以通过继承创建自己的主题基础。为了支持这一点,Android样式系统定义了这些主题使用的一些样式属性,并自动应用于多个对象。这些包括colorPrimary,colorAccent,colorControlNormal,colorControlActivated,textColorSecondary等。您可以在样式中为这些值重新赋值,以便应用新值。您还可以在样式中引用它们,这样您就可以在应用的主题中选取分配给它们的值。

最后,不同版本的Android可能会略微不同地应用样式(通常是由于对象的属性/属性的更改),尤其是任何样式系统属性。当采用Material Design时,在4.4-和5.0+版本之间尤为明显。支持库解决了其中的一些不一致问题,并且它们的每个版本似乎都稍微好一些,但是如果你需要支持4.4及更低版本,你几乎肯定会发现自己必须在值和值中定义一些样式 - v21文件夹,以便它们适用于不同的版本。

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