Custom Layout Inflation with Fragments in Robolectric not working

旧街凉风 提交于 2019-12-19 06:47:23

问题


When inflating a layout in a Fragment, with the LayoutInflater, i am getting this exception:

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

I figured out that this is happening when inflating a custom layout in

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

Edit This is the 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>

any other layout inflator works, like in this test:

@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);
    }

I am using Robolectric with the 2.2-SNAPSHOTs , Now my question is how could I work around this issue or how could I implement the missing functionality, the robolectric documentation is very sparse, hence I had trouble to find any starting point.

Full Stack Trace

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)

I also posted the issue on robolectrics issue tracker.


回答1:


I figured it out, and if you got stock to such an situation just look for your IDs in the XML, even though

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

is often seen in some example code it must be:

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



回答2:


The last version of Robolectric (3.0-Snapshot) has some problems with customized views.

To fix that, do the follow:

  1. In the module app where your code is, create a file called project.properties, at the same level as AndroidManifest.xml
  2. Fill the content with reference to the class folder of build. e.g. for StaggeredGridView:

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

Here you must check three things:

  • There should be one line per reference
  • Each reference has one number (1, 2, 3), which should be increase by one each time
  • The version number folder at the end must match with the version number in your build.gradle file.

You have an example of project working here: https://github.com/jiahaoliuliu/RobolectricSample/blob/master/app/src/main/project.properties




回答3:


In my case I got this problem when I had this in my app:

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

but this in my unittest project:

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

The older version of the support library I used in the tests didn't contain the class I was trying to use (android.support.v4.widget.DrawerLayout).




回答4:


In my case, my FragmentActivity XML was inflating a Fragment that was expecting a Bundle. I swapped the XML for a FrameLayout holder and added the fragment with the proper bundle in the activity.



来源:https://stackoverflow.com/questions/17627671/custom-layout-inflation-with-fragments-in-robolectric-not-working

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!