Android资源.UpdateConfiguration(Configuration, DisplayMetrics)已弃用

3

编辑2

示例

编辑

覆盖attachBaseContext方法以更新activity中的上下文

protected override void AttachBaseContext(Context @base)
{
    base.AttachBaseContext(@base);
}

在Android API 25中,Resources.UpdateConfiguration(Configuration, DisplayMetrics)已被弃用,建议使用Context context = CreateConfigurationContext(Configuration);代替。

当前实现

public override Resources Resources
{
    get
    {
        Resources res = base.Resources;
        Configuration config = new Configuration();
        config.SetToDefaults();

        res.UpdateConfiguration(config, res.DisplayMetrics);
        return res;
    }
}

参考Android context.getResources.updateConfiguration()被弃用,尝试以下方法:

public override Resources Resources
{
    get
    {
        Configuration overrideConfiguration = base.Resources.Configuration;
        overrideConfiguration.SetToDefaults();
        Context context = CreateConfigurationContext(overrideConfiguration);
        Resources res = context.Resources;
        return res;
    }
}

然而,这会产生异常错误。
Android.Views.InflateException: Error inflating class
com.android.internal.widget.DialogTitle

如何正确实现Context context = CreateConfigurationContext(Configuration)
注意,“当前实现”可以正常工作,但由于我们鼓励不使用已弃用的代码,所以想要替换为可行的方法。

你是否已经重写了Activity中的attachBaseContext方法来更新上下文? - Leo Zhu
base.AttachBaseContext(@base); 这里应该使用你的新上下文而不是 @base。 - Leo Zhu
尝试将以下代码添加到attachBaseContext方法中:Configuration overrideConfiguration = @base.Resources.Configuration; overrideConfiguration.SetToDefaults(); Context context = CreateConfigurationContext(overrideConfiguration); base.AttachBaseContext(context);然后在您的资源覆盖中调用以下代码:Resources res = context.Resources; return res; - Leo Zhu
@LeoZhu-MSFT 已添加Visual。@base 返回null?在这里我们是如何传递context的,应该是base.Resources吗? - jtth
是的,base.Resources,不确定是否成功,但试一试。 - Leo Zhu
你能分享一下你的项目吗?这样或许可以更准确地找到错误! - Leo Zhu
1个回答

3

不确定这是否符合您的需求,您可以像这样更改attachBaseContext方法,它可以起作用:

protected override void AttachBaseContext(Context @base)
    {
        Configuration overrideConfiguration = new Configuration();
        overrideConfiguration = @base.Resources.Configuration;
        overrideConfiguration.SetToDefaults();
        Context context = @base.CreateConfigurationContext(overrideConfiguration);
        base.AttachBaseContext(context);
    }

谢谢。这真的很有帮助 :) - Ghasan غسان

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接