android - 使用处理程序在 Android MAUI 上设置开关的 TrackColor,切换开关时不会保持设置状态

标签 android colors controls maui

我正在使用 Microsoft 的 MAUI 框架创建移动应用程序。为了打开和关闭特定功能,我在我正在处理的 NavigationPage 的 TitleView 中放置了一个 Switch 元素。

因为我使用带有深色操作栏的 Android 主题,所以 Switch 的轨道会淡入该平台的背景中。我通过使用处理程序解决了这个问题,它允许我在 Android 上设置 Switch 的 TrackColor。

问题:当我切换开关时,颜色会恢复到原来的颜色。

在 XAML 文件中:

<NavigationPage.TitleView>
        <StackLayout Orientation="Horizontal">
            <Switch x:Name="mySwitch" IsVisible="True" OnColor="White" HorizontalOptions="End" Toggled="MySwitchToggled">
                <VisualStateManager.VisualStateGroups>
                    <VisualStateGroup x:Name="CommonStates">
                        <VisualState x:Name="On">
                            <VisualState.Setters>
                                <Setter Property="ThumbColor" Value="#0082FC" /> <!--switch handle bright blue when on-->
                            </VisualState.Setters>
                        </VisualState>
                        <VisualState x:Name="Off">
                            <VisualState.Setters>
                                <Setter Property="ThumbColor" Value="White" />
                            </VisualState.Setters>
                        </VisualState>
                    </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
            </Switch>
        </StackLayout>
    </NavigationPage.TitleView>

在代码隐藏文件中:

public ItemListPage(int areaId, string areaName)
        {
            InitializeComponent();
            //some unrelated code removed here
            ModifySwitchColors(); //fix switch colors on Android
        }

        private void ModifySwitchColors()
        {
#if ANDROID
            var bgColor = Microsoft.Maui.Graphics.Colors.Gray;
            SwitchHandler.Mapper.AppendToMapping("CustomColors", (handler, view) => DependencyService.Get<INativeCalls>().ModifySwitchTrackColor(handler, view, bgColor));
#endif
        }

在平台特定代码接口(interface)的实现中:

public void ModifySwitchTrackColor(ISwitchHandler handler, ISwitch view, Microsoft.Maui.Graphics.Color inColor)
        {
            inColor.ToRgba(out var rByte, out var gByte, out var bByte, out var aByte);
            var color = new Android.Graphics.Color(rByte, gByte, bByte, aByte);
            if (Build.VERSION.SdkInt >= BuildVersionCodes.Q)
            {
                handler.PlatformView.TrackDrawable.SetColorFilter(new Android.Graphics.BlendModeColorFilter(color, Android.Graphics.BlendMode.SrcAtop));
            }
            else
            {
                handler.PlatformView.TrackDrawable.SetColorFilter(color, Android.Graphics.PorterDuff.Mode.SrcAtop);
            }
        }

有办法解决这个问题吗?

最佳答案

我终于解决了这个问题,但需要一些挖掘。解决方案是编辑开关的轨道色调列表,而不是添加滤色器:

public void ModifySwitchTrackColor(ISwitchHandler handler)
{
    //colors use argb format.
    //16842912 is Android.r.attr.state_checked which isn't in the MAUI interfaces for some reason
    handler.PlatformView.TrackTintList = new ColorStateList(
    new int[][] {
        new int[] { 16842912 },
        new int[] { } //default
    },
    new int[] {
        Android.Graphics.Color.ParseColor("#FFFFFFFF"), //checked
        Android.Graphics.Color.ParseColor("#FFBBBBBB") //unchecked
    }
    );
}

请注意,我必须直接指定 android.R.attr.state_checked 状态的常量 - MAUI 的文件没有它。我不知道这是为什么。

然后,我没有使用 AppendToMapping 调用此函数,而是在页面加载后直接调用它:

void PostOnAppearing(object sender, EventArgs e) //page Loaded event handler
{            
    DependencyService.Get<INativeCalls>().ModifySwitchTrackColor(mySwitch.Handler as ISwitchHandler);
}

调用一次后,它会在页面加载的其余部分保持不变。万岁!

关于android - 使用处理程序在 Android MAUI 上设置开关的 TrackColor,切换开关时不会保持设置状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76568904/

相关文章:

android - 当 snackbar 动画开始时, float Action 按钮会上下跳跃

java - 向 SQLite Table Android 添加数百个条目

gwt - GWT-Label 中的不同字体颜色

c# - C# 的 TreeView /文件 View 控件

android - Android-kotlin 项目中 Jacoco 代码覆盖率 0%

android - Android:Android Studio中的Gradle错误

c# - 列表框项的背景颜色(Windows 窗体)

java - 如何在java中将rgb颜色转换为int

.net - GroupBox 控件中的圆角

wolfram-mathematica - 在 Mathematica 中使用 Manipulate 控制放置