动态更改android的装饰色

时间:2020-10-08 06:06:06

标签: android xamarin.forms themes

我将Android的强调色设置为灰色,因此在任何主题(浅色或深色)中看起来都是正常的。例如,灰色非常适合编辑控件,但事实证明,它也用于警报取消按钮的文本中。因此,现在在浅色主题上看起来不错,但在深色主题上却很糟糕。

如何从Xamarin.Forms应用动态更改Android的colorAccent

enter image description here enter image description here

编辑:到目前为止,这里是my theme changing code。 (我没有使用AppThemeBinding,因为这种方法允许使用两个以上的主题)

3 个答案:

答案 0 :(得分:0)

您不能这样做,因为在主题中定义了强调色,并且主题是只读的。我认为动态地意味着程序化。

答案 1 :(得分:0)

我想您想应用“昼夜”主题。

因此,为了对这个功能有更深入的了解,您应该学习下面链接的文档。

https://developer.android.com/guide/topics/ui/look-and-feel/darktheme

不仅复制和粘贴代码,还必须学习可增强知识的文档。保持微笑。

答案 2 :(得分:0)

在Xamarin表单中,我们可以使用 DependencyService 来调用本地方法。幸运的是,Android文档提供了方法setLocalNightMode来修改本地DarkMode。我们应该注意,此方法无法修改Mobile的设置的配置。

现在我们可以创建一个IDarkModeService界面:

public interface IDarkModeService
{
    void SetDarkMode(bool value);
}

然后在Android解决方案中实现其方法:

public class DarkModeService : IDarkModeService
{
    public void SetDarkMode(bool value)
    {
        if (value)
        {
            
     MainActivity.instance.Delegate.SetLocalNightMode(AppCompatDelegate.ModeNightYes);
            MainActivity.instance.Recreate();
        }
        else
        {
       
     MainActivity.instance.Delegate.SetLocalNightMode(AppCompatDelegate.ModeNightNo);
            MainActivity.instance.Recreate();
        }
      
    }
}

在这里,我们需要从 MainActivity

创建一个静态instance
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    public static MainActivity instance { set; get; }

    protected override void OnCreate(Bundle savedInstanceState)
    {
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;

        instance = this;

        base.OnCreate(savedInstanceState);

        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
        LoadApplication(new App());
    }
   
}

}

不要忘记在styles.xml内添加配置以使应用程序支持 DarkMode

<style name="MainTheme" parent="Theme.AppCompat.DayNight.NoActionBar"></style>

最后,我们可以在Xamarin Forms中调用依赖方法,如下所示:

private async void ShowDialog_Clicked(object sender, EventArgs e)
{
    await DisplayAlert("Alert", "You have been alerted", "OK");
}

private void SetDarkMode_Clicked(object sender, EventArgs e)
{
    DependencyService.Get<IDarkModeService>().SetDarkMode(true);
}

private void CancelDarkMode_Clicked(object sender, EventArgs e)
{
    DependencyService.Get<IDarkModeService>().SetDarkMode(false);
}

效果:

enter image description here

==================================更新============ =====================

如果需要自定义每个主题的样式,则可以在运行时交换主题

首先,您可以在Xamrin表单中存储主题标志( DarkMode ):

private void SetDarkMode_Clicked(object sender, EventArgs e)
{
    Preferences.Set("DarkMode", true);
    DependencyService.Get<IDarkModeService>().SetDarkMode(true);
}

private void CancelDarkMode_Clicked(object sender, EventArgs e)
{
    Preferences.Set("DarkMode", false);
    DependencyService.Get<IDarkModeService>().SetDarkMode(false);
}

然后在 styles.xml 中添加每个主题样式:

<?xml version="1.0" encoding="utf-8" ?>
<resources>

  <style name="MainTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
   
  </style>

  <style name="DayTheme" parent="MainTheme">
   
  </style>

  <style name="NightTheme" parent="MainTheme" >
    <item name="buttonBarPositiveButtonStyle">@style/positiveBtnStyle</item>
    <item name="buttonBarNegativeButtonStyle">@style/negativeBtnstyle</item>
  </style>

  <!--style of sure button-->
  <style name="positiveBtnStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
    <item name="android:textColor">#0000ff</item>
  </style>

  <!--style of cancel button-->
  <style name="negativeBtnstyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
    <item name="android:textColor">#999999</item>
  </style>

</resources>

最后,在 MainActivity.cs 中创建视图之前更改主题:

public static MainActivity instance { set; get; }
protected override void OnCreate(Bundle savedInstanceState)
{
    TabLayoutResource = Resource.Layout.Tabbar;
    ToolbarResource = Resource.Layout.Toolbar;

    instance = this;

    var darkMode = Preferences.Get("DarkMode", false);
    if (darkMode)
    {
        this.SetTheme(Resource.Style.NightTheme);
    }
    else
    {
        this.SetTheme(Resource.Style.DayTheme);
    }

    base.OnCreate(savedInstanceState);

    Xamarin.Essentials.Platform.Init(this, savedInstanceState);
    global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
    LoadApplication(new App());
}

现在我们可以看到按钮的颜色样式将会改变:

enter image description here