从特定上下文

时间:2017-12-18 14:36:51

标签: java android android-layout

我试图给包含约束布局的片段进行充气,但是我收到了这个错误:

FATAL EXCEPTION: main
Process: modular.testing, PID: 12485
android.view.InflateException: Binary XML file line #0: Binary XML file line #0: Error inflating class android.support.constraint.ConstraintLayout
Caused by: android.view.InflateException: Binary XML file line #0: Error inflating class android.support.constraint.ConstraintLayout
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.constraint.ConstraintLayout" on path: DexPathList[[],nativeLibraryDirectories=[/data/app/smartmoov.solutions.generateddynamiclib-1/lib/arm64, /system/lib64, /vendor/lib64, /system/vendor/lib64, /product/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at android.view.LayoutInflater.createView(LayoutInflater.java:616)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:798)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:738)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:869)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:832)
at android.view.LayoutInflater.inflate(LayoutInflater.java:518)
at android.view.LayoutInflater.inflate(LayoutInflater.java:426)

让我解释一下我的建筑有点特别。我有一个主应用程序加载其他"模块"。模块是具有相同sharedUserId属性的应用程序,包含代码和资源。

要加载模块的资源,我必须指定LayoutInflater的上下文,就像在Fragment的这个例子中一样:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    Context context = getActivity().createPackageContext("insert package name here", Context.CONTEXT_IGNORE_SECURITY);
    return LayoutInflater.from(context).inflate(R.layout.fragment_generated_dynamic_lib, container, false);
}

如果使用LinearLayout它运行良好但我得到一个奇怪的ClassNotFound错误。我在gradle文件中实现了ContrainstLayout(即使使用force选项),如果包含ContrainstLayout lib,则使用ClassyShark进行检查。

在通知中使用约束布局时,我看到了一些类似的问题,我不知道是否有链接!

如果可以提供帮助,请提前致谢;)

编辑:

经过一些实验,如果我发起一个活动,即使是一个膨胀的片段,活动也可以正确地膨胀一个包含ConstraintLayout的片段。

然后我比较他们的classLoader:

GeneratedDynamicLib: onCreateView: getClassLoader() ? dalvik.system.PathClassLoader[DexPathList[[],nativeLibraryDirectories=[/data/app/smartmoov.solutions.generateddynamiclib-1/lib/arm64, /system/lib64, /vendor/lib64, /system/vendor/lib64, /product/lib64]]]
ActivityTest: onCreateView: getClassLoader ? dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/smartmoov.solutions.generateddynamiclib-1/base.apk"],nativeLibraryDirectories=[/data/app/smartmoov.solutions.generateddynamiclib-1/lib/arm64, /system/lib64, /vendor/lib64, /system/vendor/lib64, /product/lib64]]]

我知道上下文有所不同,因为我使用了Intent和startActivity,但在我使用的片段中:

getActivity().createPackageContext(getClass().getPackage().getName(), Context.CONTEXT_IGNORE_SECURITY);

您知道是否可以创建与活动相同的Context或ClassLoader?

0 个答案:

没有答案