运行环境
设备型号:如:vivo x9
设备系统版本:如 7.1.2
- [x] QMUI Android 版本:
2.0.0 alpha 10
在某些型号上Qmui的皮肤功能报错。
Log.e===QMUISkin===Failed to inflate view androidx.viewpager.widget.ViewPager; error: Binary XML file line #64: Error inflating class
Log.e===QMUISkin===Failed to inflate view com.qmuiteam.qmui.widget.roundwidget.QMUIRoundLinearLayout; error: Binary XML file line #89: Error inflating class
Log.e===QMUISkin===Failed to inflate view LinearLayout; error: Binary XML file line #129: Error inflating class
导致切换皮肤时无法全部生效,或者fragment 当中的部分颜色没有被替换
如QmuiDemo 切换夜间模式,会导致 homeFramgent 当中的图标颜色无法展示
运行环境
设备型号:Mi-4c
设备系统版本:7.0
小米手机也会有类反射得错误 比较奇怪,不知道是不是系统魔改了什么(Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Looper android.content.Context.getMainLooper()' on a null object reference)
但是在另外一台小米设备上就是好的
2020-08-10 18:35:31.774 18150-18150/com.cci.scaffold W/System.err: android.view.InflateException: Binary XML file line #66: Error inflating class
2020-08-10 18:35:31.775 18150-18150/com.cci.scaffold W/System.err: Caused by: java.lang.reflect.InvocationTargetException
2020-08-10 18:35:31.775 18150-18150/com.cci.scaffold W/System.err: at java.lang.reflect.Constructor.newInstance0(Native Method)
2020-08-10 18:35:31.775 18150-18150/com.cci.scaffold W/System.err: at java.lang.reflect.Constructor.newInstance(Constructor.java:430)
2020-08-10 18:35:31.775 18150-18150/com.cci.scaffold W/System.err: at android.view.LayoutInflater.createView(LayoutInflater.java:652)
2020-08-10 18:35:31.775 18150-18150/com.cci.scaffold W/System.err: at com.cci.skin.SkinLayoutInflaterFactory.onCreateView(SkinLayoutInflaterFactory.kt:64)
2020-08-10 18:35:31.775 18150-18150/com.cci.scaffold W/System.err: at android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.java:192)
2020-08-10 18:35:31.775 18150-18150/com.cci.scaffold W/System.err: at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:794)
2020-08-10 18:35:31.775 18150-18150/com.cci.scaffold W/System.err: at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:752)
2020-08-10 18:35:31.776 18150-18150/com.cci.scaffold W/System.err: at android.view.LayoutInflater.rInflate(LayoutInflater.java:883)
2020-08-10 18:35:31.776 18150-18150/com.cci.scaffold W/System.err: at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:846)
2020-08-10 18:35:31.776 18150-18150/com.cci.scaffold W/System.err: at android.view.LayoutInflater.inflate(LayoutInflater.java:522)
2020-08-10 18:35:31.776 18150-18150/com.cci.scaffold W/System.err: at android.view.LayoutInflater.inflate(LayoutInflater.java:430)
2020-08-10 18:35:31.776 18150-18150/com.cci.scaffold W/System.err: at com.cci.scaffold.ui.contacts.ContactsFragment.onCreateView(ContactsFragment.kt:46)
2020-08-10 18:35:31.776 18150-18150/com.cci.scaffold W/System.err: at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698)
2020-08-10 18:35:31.776 18150-18150/com.cci.scaffold W/System.err: at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320)
2020-08-10 18:35:31.776 18150-18150/com.cci.scaffold W/System.err: at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
2020-08-10 18:35:31.776 18150-18150/com.cci.scaffold W/System.err: at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2224)
2020-08-10 18:35:31.776 18150-18150/com.cci.scaffold W/System.err: at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1997)
2020-08-10 18:35:31.776 18150-18150/com.cci.scaffold W/System.err: at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1953)
2020-08-10 18:35:31.776 18150-18150/com.cci.scaffold W/System.err: at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849)
2020-08-10 18:35:31.776 18150-18150/com.cci.scaffold W/System.err: at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413)
2020-08-10 18:35:31.777 18150-18150/com.cci.scaffold W/System.err: at android.os.Handler.handleCallback(Handler.java:754)
2020-08-10 18:35:31.777 18150-18150/com.cci.scaffold W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
2020-08-10 18:35:31.777 18150-18150/com.cci.scaffold W/System.err: at android.os.Looper.loop(Looper.java:163)
2020-08-10 18:35:31.777 18150-18150/com.cci.scaffold W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6358)
2020-08-10 18:35:31.777 18150-18150/com.cci.scaffold W/System.err: at java.lang.reflect.Method.invoke(Native Method)
2020-08-10 18:35:31.777 18150-18150/com.cci.scaffold W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:880)
2020-08-10 18:35:31.777 18150-18150/com.cci.scaffold W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770)
2020-08-10 18:35:31.778 18150-18150/com.cci.scaffold W/System.err: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Looper android.content.Context.getMainLooper()' on a null object reference
2020-08-10 18:35:31.778 18150-18150/com.cci.scaffold W/System.err: at miui.util.AttributeResolver.cg(SourceFile:35)
2020-08-10 18:35:31.778 18150-18150/com.cci.scaffold W/System.err: at miui.util.AttributeResolver.resolveInt(SourceFile:145)
2020-08-10 18:35:31.778 18150-18150/com.cci.scaffold W/System.err: at miui.util.AttributeResolver.isUsingMiuiTheme(SourceFile:179)
2020-08-10 18:35:31.778 18150-18150/com.cci.scaffold W/System.err: at miui.os.Environment.isUsingMiui(SourceFile:108)
2020-08-10 18:35:31.778 18150-18150/com.cci.scaffold W/System.err: at android.view.ViewConfigurationInjector.get(ViewConfigurationInjector.java:18)
2020-08-10 18:35:31.778 18150-18150/com.cci.scaffold W/System.err: at android.view.ViewConfiguration.get(ViewConfiguration.java:369)
2020-08-10 18:35:31.778 18150-18150/com.cci.scaffold W/System.err: at android.view.View.(View.java:4006)
2020-08-10 18:35:31.778 18150-18150/com.cci.scaffold W/System.err: at android.view.View.(View.java:4126)
2020-08-10 18:35:31.778 18150-18150/com.cci.scaffold W/System.err: at android.view.View.(View.java:4089)
2020-08-10 18:35:31.778 18150-18150/com.cci.scaffold W/System.err: at com.cci.core.widget.ContactsIndexView.(ContactsIndexView.kt:22)
2020-08-10 18:35:31.778 18150-18150/com.cci.scaffold W/System.err: at com.cci.core.widget.ContactsIndexView.(ContactsIndexView.kt:23)
2020-08-10 18:35:31.778 18150-18150/com.cci.scaffold W/System.err: ... 27 more
Demo 在小米手机上运行也会报错:
2020-08-10 19:35:48.974 19037-19037/com.qmuiteam.qmuidemo E/QMUISkin: Failed to inflate view com.qmuiteam.qmui.widget.QMUIWindowInsetLayout; error: Binary XML file line #17: Error inflating class com.qmuiteam.qmui.widget.QMUIWindowInsetLayout
2020-08-10 19:35:48.977 19037-19037/com.qmuiteam.qmuidemo E/QMUISkin: Failed to inflate view com.qmuiteam.qmui.widget.QMUIViewPager; error: Binary XML file line #25: Error inflating class com.qmuiteam.qmui.widget.QMUIViewPager
2020-08-10 19:35:48.981 19037-19037/com.qmuiteam.qmuidemo E/QMUISkin: Failed to inflate view com.qmuiteam.qmui.widget.tab.QMUITabSegment; error: Binary XML file line #31: Error inflating class com.qmuiteam.qmui.widget.tab.QMUITabSegment
2020-08-10 19:35:49.006 19037-19037/com.qmuiteam.qmuidemo E/QMUISkin: Failed to inflate view androidx.recyclerview.widget.RecyclerView; error: Binary XML file line #22: Error inflating class androidx.recyclerview.widget.RecyclerView
2020-08-10 19:35:49.010 19037-19037/com.qmuiteam.qmuidemo E/QMUISkin: Failed to inflate view com.qmuiteam.qmui.widget.QMUITopBarLayout; error: Binary XML file line #29: Error inflating class com.qmuiteam.qmui.widget.QMUITopBarLayout
2020-08-10 19:35:49.033 19037-19037/com.qmuiteam.qmuidemo E/QMUISkin: Failed to inflate view androidx.recyclerview.widget.RecyclerView; error: Binary XML file line #22: Error inflating class
2020-08-10 19:35:49.035 19037-19037/com.qmuiteam.qmuidemo E/QMUISkin: Failed to inflate view com.qmuiteam.qmui.widget.QMUITopBarLayout; error: Binary XML file line #29: Error inflating class
2020-08-10 19:35:49.043 19037-19037/com.qmuiteam.qmuidemo E/QMUISkin: Failed to inflate view androidx.recyclerview.widget.RecyclerView; error: Binary XML file line #22: Error inflating class
2020-08-10 19:35:49.045 19037-19037/com.qmuiteam.qmuidemo E/QMUISkin: Failed to inflate view com.qmuiteam.qmui.widget.QMUITopBarLayout; error: Binary XML file line #29: Error inflating class
我在 7.0上 activity 可以换肤,但是 fragment中 LinearLayout 等viewgroup 不可以换,后边用java的方式 不用XML的方式解决了!可以试试!7.0 以上版本是可以的!
anroid8.0 兜了底 。因为android7.1 的代码逻辑是使用了中间类代理Factory2的话里面有一个保存view构造函数的参数的Object[]里的第一个参数也就是context会没有赋值。8.0后面就修复了这个问题https://android.googlesource.com/platform/frameworks/base/+/9a376bcd4576029a8d0ad03254a6240cd1422c2e%5E%21/#F0 可以在LayoutInflater.Factory2实现类里加入如下兼容代码(伪代码)
if (Build.VERSION.SDK_INT <= 25) {
Field constructorArgsField = LayoutInflater.class.getDeclaredField("mConstructorArgs");
Object[] originArgs = (Object[]) constructorArgsField.get(Object[].class);
constructorArgsField.setAccessible(true);
if (originArgs == null || originArgs[0] == null) {
Object[] constructorArgs = new Object[2];
constructorArgs[0] = context;
constructorArgsField.set(Object[].class, constructorArgs);
}
}