3

我正在创建一个从 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 来首先禁用充气。

4

1 回答 1

1

转到您的 R 类文件并找到指向0x7F030018的内容

编辑

您必须添加

if (!isInEditMode())
{
   // Your major LayoutInflater codes goes here
}

在您的自定义视图的构造函数中。然后它会构建。

于 2013-06-27T08:12:37.470 回答