【问题标题】:How to replace deprecated Android "Context.Resources.UpdateConfiguration" in Xamarin.Form project?如何在 Xamarin.Form 项目中替换已弃用的 Android“Context.Resources.UpdateConfiguration”?
【发布时间】:2019-12-05 05:11:55
【问题描述】:

我正在使用这个 Android API Context.Resources.UpdateConfiguration(Configuration, DisplayMetrics),但它已被弃用,因此它在更高版本的 Android 系统中不起作用。我在网上做了研究,但只找到了 Java 解决方案,我无法在我的 Xamarin.Form 项目中将其翻译成 C#。

Google 文档说它已更新为 Context.CreateConfigurationContext(Configuration),但这对我不起作用(当然,DisplayMetrics 甚至没有进化)。

    public void SetStandardFontSize()
    {
        Configuration configuration = Android.App.Application.Context.Resources.Configuration;
        configuration.FontScale = (float)1;
        DisplayMetrics metrics = new DisplayMetrics();
        (MainActivity.mainContext as MainActivity).WindowManager.DefaultDisplay.GetMetrics(metrics);
        metrics.ScaledDensity = configuration.FontScale * metrics.Density;

        //deprecated
        Android.App.Application.Context.Resources.UpdateConfiguration(configuration, metrics);   
    }

我只是想使用上面的功能(从stackoverflow帖子中学习)来覆盖Android系统中用户自定义的字体大小设置。 所以我正在寻找一种正确的方法来更新与所有版本的Android系统兼容的配置。

非常感谢。

PS: Android.App.Application.Context.Resources.DisplayMetrics.SetTo(metrics); Android.App.Application.Context.Resources.Configuration.SetTo(configuration); 这仅适用于 Android 6,与已弃用的功能相同。

【问题讨论】:

  • 你想让我给你一个详细的答案吗?
  • @G.hakim 我试过 Android.App.Application.Context.Resources.DisplayMetrics.SetTo(metrics); Android.App.Application.Context.Resources.Configuration.SetTo(configuration);但它仍然只适用于 Android 6,与已弃用的功能相同。因此,任何其他解决方案和详细代码将不胜感激!!!

标签: c# android xamarin.forms xamarin.android


【解决方案1】:

试试这个

BaseContext.CreateConfigurationContext(configuration);
BaseContext.Resources.DisplayMetrics.SetTo(metrics);

【讨论】:

    【解决方案2】:

    我不知道确切原因,但它就是这样工作的,

        protected override void AttachBaseContext(Context @base)
        {
            Configuration overrideConfiguration = new Configuration();
            overrideConfiguration = @base.Resources.Configuration;
            overrideConfiguration.SetToDefaults();
            Context context = @base.CreateConfigurationContext(overrideConfiguration);
            base.AttachBaseContext(context);
        }
    
        public override Resources Resources
        {
            get
            {
                Resources res = base.Resources;
                Configuration config = new Configuration();
                config.SetToDefaults();
    
                res.UpdateConfiguration(config, res.DisplayMetrics);
                return res;
            }
        }
    

    我希望也许有人可以为我解释,但更重要的是,我希望它对其他人有用作为参考。

    【讨论】:

      【解决方案3】:

      您需要检查Android版本并执行:https://docs.microsoft.com/en-us/xamarin/android/app-fundamentals/android-api-levels?tabs=windows#runtime-checks-for-android-versions

      if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Lollipop)
      {
          // Do things the Lollipop way
      }
      else
      {
          // Do things the pre-Lollipop way
      }
      

      【讨论】:

      • 是的,我认为 'DisplayMetrics.SetTo(metrics)' 和 'Configuration.SetTo(configuration)' 可以放入“else”部分,但是应该放入“if”部分,哪个是用于高于 Lollipop 的版本吗?
      • @solidcomer 我对您的特定问题不太感兴趣,但是您需要查看 API 是从哪个版本弃用的,如果相应地调整它,将弃用的 API 放入 if 并将新的 API 放入 else。
      • 我明白了!但另一方面,更高版本的 API 会在仍然适用已弃用 API 的低版本系统中工作吗?此外,我仍在努力寻找替换 Context.Resources.UpdateConfiguration 的方法。感谢您的回复。
      • 这就是如果,它永远不会被执行。所以它会起作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 2020-02-27
      • 2021-11-25
      • 1970-01-01
      • 2020-06-07
      相关资源
      最近更新 更多