首页 > 解决方案 > 切换主题 xamarin.android

问题描述

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

样式.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>

布局.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

解决方案


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


推荐阅读