我正在创建一个从 FrameLayout 扩展的自定义视图。
在每个 CTOR 中,我使用 LayoutInflater 从 XML 中膨胀一些视图,使用类似这样的东西(在一个名为“init()”的函数中):
final LayoutInflater inflater = LayoutInflater.from(context);
inflater.inflate(R.layout.custom_view, this, true); // <= here there is an NPE
问题是,即使应用程序在这段代码中运行良好,图形设计器也经常无法呈现自定义视图——它一直在错误日志中写下这样的内容:
The following classes could not be instantiated:
- com.example.customviewtest.CustomView (Open Class, Show Error Log)
See the Error Log (Window > Show View) for more details.
Tip: Use View.isInEditMode() in your custom views to skip code when shown in Eclipse
android.content.res.Resources$NotFoundException: Could not resolve resource value: 0x7F030018.
at android.content.res.BridgeResources.throwException(BridgeResources.java:693)
at android.content.res.BridgeResources.getLayout(BridgeResources.java:271)
at android.view.LayoutInflater.inflate(LayoutInflater.java:394)
at com.example.customviewtest.CustomView.init(CustomView .java:38)
at com.example.customviewtest.CustomView.<init>(CustomView .java:26)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0( at sun.reflect.NativeConstructorAccessorImpl.newInstance( at sun.reflect.DelegatingConstructorAccessorImpl.newInstance( at java.lang.reflect.Constructor.newInstance( at com.android.ide.eclipse.adt.internal.editors.layout.ProjectCallback.instantiateClass(ProjectCallback.java:422)
at com.android.ide.eclipse.adt.internal.editors.layout.ProjectCallback.loadView(ProjectCallback.java:179)
at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:207)
at android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:135)
at android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:746)
at android.view.LayoutInflater_Delegate.rInflate(LayoutInflater_Delegate.java:64)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:718)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:372)
它似乎只是偶尔发生,我不明白在哪些情况下。就像真正的代码与图形编辑器不同步。有时它甚至声称我正在尝试将视图投射到完全不同类型的视图。
我的问题
为什么会发生?它是 ADT 错误吗?
我尝试了多种使用充气机的方法,包括:
getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)
而且我还尝试对 onFinishInflate 方法进行充气,但没有任何效果。
似乎很多人都发布了这个问题,但没有人找到解决方案,只是简单地使用 isInEditMode 来首先禁用充气。