【问题标题】:Is it possible to use AppThemeBinding in Android Custom Styles?是否可以在 Android 自定义样式中使用 AppThemeBinding?
【发布时间】:2020-06-25 10:37:30
【问题描述】:

我正在尝试使用新的AppThemeBinding 为 Android 实现暗模式。它适用于 Android 和 iOS,但我不知道如何为自定义渲染器或自定义样式实现它。

例如,我有一个自定义的 Stepper 渲染器,它看起来像这样:

protected override void OnElementChanged(ElementChangedEventArgs<Stepper> e)
{
    base.OnElementChanged(e);
    if (Control != null)
    {
        Android.Widget.Button buttonDown = (Android.Widget.Button)Control.GetChildAt(0);
        Android.Widget.Button buttonUp = (Android.Widget.Button)Control.GetChildAt(1);
        if(e.NewElement != null)
        {
            //Button Down
            buttonDown.SetBackgroundResource(Resource.Drawable.button_bg_left);
            buttonDown.LayoutParameters = new LinearLayout.LayoutParams(DpToPixel(50), DpToPixel(33));
            buttonDown.SetPadding(0,0,0,0);
            buttonDown.SetTextColor(Android.Graphics.Color.ParseColor("#007bff"));
            //Button Up
            buttonUp.SetBackgroundResource(Resource.Drawable.button_bg_right);
            buttonUp.LayoutParameters = new LinearLayout.LayoutParams(DpToPixel(50), DpToPixel(33));
            buttonUp.SetPadding(0, 0, 0, 0);
            buttonUp.SetTextColor(Android.Graphics.Color.ParseColor("#007bff"));
                  
        }
    }
}

我正在设置一个后台资源,它是一个.xml 文件,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#FFFFFF"/>
    <stroke android:width="1dp" android:color="#007bff" />
    <corners
            android:topLeftRadius="5dp"
            android:bottomLeftRadius="5dp"/>
</shape>

由于 AppThemeBinding 是一个标记扩展并在 .xaml 文件中工作,我不知道如何为我的 android 特定渲染器实现颜色更改?

我怎样才能改变我的自定义形状的颜色以用于亮/暗模式?

【问题讨论】:

    标签: xamarin.forms xamarin.android


    【解决方案1】:

    你可以在渲染器中Detect the current system theme然后设置对应的颜色:

    class MyStepperRenderer : StepperRenderer
    {
        public MyStepperRenderer(Context context) : base(context)
        {
        }
    
        protected override void OnElementChanged(ElementChangedEventArgs<Stepper> e)
        {
            base.OnElementChanged(e);
    
            OSAppTheme currentTheme = Xamarin.Forms.Application.Current.RequestedTheme;
    
            if (currentTheme == OSAppTheme.Light)
            {
                //
            }
            else
            {
                //
            }
        }
    }
    

    【讨论】:

    • 酷,这适用于我的自定义渲染器!但有一件事我仍然很好奇。我得到了我的styles.xml 文件,我在其中定义了MainActivity.cs 中引用的主题颜色。我将如何改变这些颜色以响应 AppTheme 的变化?
    • 您的意思是在渲染器中无法从styles.xml 获取颜色?
    • 不 - 我的意思是通过设置像 Theme = "@style/MainTheme" 这样的主题颜色像 colorPrimarycolorAccent 用于 Xamarin.Forms 中的某些元素,例如,如果我有一个 TableView 的标题在没有自定义渲染器的情况下,部分会自动以其中一种颜色着色。我是否必须创建一个自定义渲染器来根据当前的 OSAppTheme 更改颜色?
    • 不行,如果是在Xamarin.forms中,可以直接通过:&lt;Label Text="This text is green in light mode, and red in dark mode." TextColor="{AppThemeBinding Light=Green, Dark=Red}" /&gt;设置颜色。就像document中的代码一样。
    • 很抱歉造成混淆,它不是直接在表单中。以一个简单的选择器为例 - 在 Android 中,选择器下方有一条彩色线,一旦您单击它就会改变。我用我在MainActivity 中设置的Theme 控制这些颜色,但是这些颜色只在.xml 文件中定义,而不是在自定义渲染器中。
    猜你喜欢
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多