7

当使用 LayoutInflater 在 Fragment 中膨胀布局时,我遇到了这个异常:

 ./res/layout/locations_list.xml line #-1 (sorry, not yet implemented): Error inflating class com.costum.android.widget.LoadMoreListView

我发现这是在膨胀自定义布局时发生的

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.locations_list, container, false);
    }

编辑这是locations_list.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    android:orientation="vertical" >

    <com.costum.android.widget.LoadMoreListView
        android:id="@+id/android:list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="0dp" />

</LinearLayout>

任何其他布局充气机都可以工作,就像在这个测试中一样:

@Test
    public void testInflator() {
        ActivityController<SherlockFragmentActivity> activityController = CustomTestRunner
                .startActivity();
        SherlockFragmentActivity activity = activityController.get();
        LayoutInflater from = LayoutInflater.from(activity);
        View view = from
                .inflate(com.twisper.R.layout.locations_list_item, null);
        assertNotNull(view);
    }

我正在将 Robolectric 与 2.2-SNAPSHOTs 一起使用,现在我的问题是如何解决这个问题或如何实现缺少的功能,robolectric 文档非常稀疏,因此我很难找到任何起点。

全栈跟踪

android.view.InflateException: XML file ./res/layout/locations_list.xml line #-1 (sorry, not yet implemented): Error inflating class com.costum.android.widget.LoadMoreListView
    at android.view.LayoutInflater.createView(LayoutInflater.java:613)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
...
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at android.view.LayoutInflater.$$robo$$LayoutInflater_1d1f_createView(LayoutInflater.java:587)
    at android.view.LayoutInflater.createView(LayoutInflater.java)
    at android.view.LayoutInflater.$$robo$$LayoutInflater_1d1f_createViewFromTag(LayoutInflater.java:687)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java)
    at android.view.LayoutInflater.$$robo$$LayoutInflater_1d1f_rInflate(LayoutInflater.java:746)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java)
    at android.view.LayoutInflater.$$robo$$LayoutInflater_1d1f_inflate(LayoutInflater.java:489)
    at android.view.LayoutInflater.inflate(LayoutInflater.java)
    at android.view.LayoutInflater.$$robo$$LayoutInflater_1d1f_inflate(LayoutInflater.java:396)
    at android.view.LayoutInflater.inflate(LayoutInflater.java)

...

Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -9
    at java.lang.String.substring(String.java:1911)
    at org.robolectric.res.ResName.qualifyResName(ResName.java:50)
    at org.robolectric.res.Attribute.getResourceReference(Attribute.java:138)
    at org.robolectric.res.Attribute.qualifiedValue(Attribute.java:127)
    at org.robolectric.res.builder.XmlFileBuilder$XmlResourceParserImpl.qualify(XmlFileBuilder.java:316)
    at org.robolectric.res.builder.XmlFileBuilder$XmlResourceParserImpl.getAttributeValue(XmlFileBuilder.java:340)
    at org.robolectric.shadows.ShadowResources.findAttributeValue(ShadowResources.java:252)
    at org.robolectric.shadows.ShadowResources.attrsToTypedArray(ShadowResources.java:188)
    at org.robolectric.shadows.ShadowResources.access$000(ShadowResources.java:51)
    at org.robolectric.shadows.ShadowResources$ShadowTheme.obtainStyledAttributes(ShadowResources.java:460)

我还在robolectrics 问题跟踪器上发布了这个问题。

4

4 回答 4

5

我想通了,如果您遇到这种情况,只需在 XML 中查找您的 ID,即使

 android:id="@+id/android:list"

在一些示例代码中经常可以看到它必须是:

 android:id="@android:id/list"
于 2013-08-02T10:13:56.570 回答
2

Robolectric 的最新版本(3.0-Snapshot)在自定义视图方面存在一些问题。

要解决此问题,请执行以下操作:

  1. 在您的代码所在的模块应用程序中,创建一个名为 project.properties 的文件,与 AndroidManifest.xml 处于同一级别
  2. 参照build的class文件夹填写内容。例如对于交错网格视图:

android.library.reference.1=../../build/intermediates/exploded-aar/com.etsy.android.grid/library/1.0.5

在这里你必须检查三件事:

  • 每个参考应该有一行
  • 每个引用有一个数字(1、2、3),每次加一
  • 最后的版本号文件夹必须与 build.gradle 文件中的版本号匹配。

您在这里有一个项目示例: https ://github.com/jiahaoliuliu/RobolectricSample/blob/master/app/src/main/project.properties

于 2015-03-22T07:12:41.433 回答
0

就我而言,当我在我的应用程序中遇到这个问题时,我遇到了这个问题:

    <dependency>
        <groupId>com.google.android</groupId>
        <artifactId>support-v4</artifactId>
        <version>r13</version>
    </dependency>

但这在我的单元测试项目中:

    <dependency>
        <groupId>com.google.android</groupId>
        <artifactId>support-v4</artifactId>
        <version>r7</version>
    </dependency>

我在测试中使用的旧版本支持库不包含我尝试使用的类 (android.support.v4.widget.DrawerLayout)。

于 2014-01-20T14:54:14.993 回答
0

就我而言,我的FragmentActivityXML 膨胀了Fragment预期的Bundle. 我将 XML 交换为FrameLayout持有者,并在活动中添加了带有正确捆绑包的片段。

于 2014-04-10T17:35:16.887 回答