我将Android的强调色设置为灰色,因此在任何主题(浅色或深色)中看起来都是正常的。例如,灰色非常适合编辑控件,但事实证明,它也用于警报取消按钮的文本中。因此,现在在浅色主题上看起来不错,但在深色主题上却很糟糕。
如何从Xamarin.Forms应用动态更改Android的colorAccent
?
编辑:到目前为止,这里是my theme changing code。 (我没有使用AppThemeBinding
,因为这种方法允许使用两个以上的主题)
答案 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);
}
效果:
==================================更新============ =====================
如果需要自定义每个主题的样式,则可以在运行时交换主题。
首先,您可以在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());
}
现在我们可以看到按钮的颜色样式将会改变: