广告也精彩
目录

前言

Android换肤插件开发时,需要依赖LayoutInflater.Factory类,在Android P和 之前版本都测试ok,但放在Android Q(10)上测试就失效了。

本文记录一下失效的原因和解决的方法。

正文

在Android Q之前版本,通过如下代码可以设置的

 try {
     LayoutInflater layoutInflater = LayoutInflater.from(context);
     Field mFactorySet = LayoutInflater.class.getDeclaredField("mFactorySet");
     mFactorySet.setAccessible(true);
     mFactorySet.set(layoutInflater, false);
     LayoutInflaterCompat.setFactory2(layoutInflater, SkinInflaterFactory.getInstance());
 } catch (Exception e) {
     e.printStackTrace();
 }

但是,Android Q版本或者之后的版本,使用上面代码就提示错误:

java.lang.NoSuchFieldException: No field mFactorySet in class Landroid/view/LayoutInflater; (declaration of 'android.view.LayoutInflater' appears in /system/framework/framework.jar!classes3.dex)

原因是LayoutInflater中的mFactorySet变量做了版本限制,如下,也就是最大支持Android P,之后的版本就无法使用了。

    /**
     * If any developer has desire to change this value, they should instead use
     * {@link #cloneInContext(Context)} and set the new factory in thew newly-created
     * LayoutInflater.
     */
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
    private boolean mFactorySet;

网上其他大佬也遇到过,根据大佬说的方向,我这边也整理了一下,测试ok。

隐藏内容!
付费阅读后才能查看!
2
多个隐藏块只需支付一次

参考文章

  1. 解决mFactorySet在Android Q中被非SDK接口限制的问题 - 掘金 (juejin.cn)
  2. No field mFactorySet in class问题解决(上)_Ciruy B.Heimerdinger的博客-CSDN博客

 历史上的今天

版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站文章: 部分来源于网络,仅供站长学习和参考,若侵权请留言
广告也精彩

相关文章

广告也精彩

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

暂无评论...

网站升级中

公告

近期网站升级中,可能存在一些bug。欢迎反馈 https://www.91es.com/we.html

本站域名

本站域名 : 91es.com3xcn.com。本站邮箱 : 站长邮箱 i@oorr.cn,通知邮箱we@oorr.cn ,如有更新,请看公告 。