Инфляция пользовательского макета с фрагментами в Robolectric не работает

При раздувании макета во фрагменте с помощью LayoutInflater я получаю это исключение:

 ./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);
    }

Изменить Это location_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.


person joecks    schedule 13.07.2013    source источник
comment
опубликовать location_list.xml   -  person pskink    schedule 13.07.2013
comment
Добавьте недостающий файл.   -  person joecks    schedule 13.07.2013
comment
Вы уверены, что у вас есть класс com.costum.android.widget .LoadMoreListView? может в костюме опечатка?   -  person pskink    schedule 13.07.2013
comment
хм, опечатка, но не моя. Это правильный идентификатор группы, и его запуск на Android работает.   -  person joecks    schedule 13.07.2013
comment
я не понял, так работает или нет? и какой идентификатор группы вы имеете в виду?   -  person pskink    schedule 13.07.2013
comment
Извините за недопонимание, com.costum. является правильным пакетом, поэтому проблема все еще присутствует.   -  person joecks    schedule 13.07.2013


Ответы (4)


Я разобрался, и если у вас есть запас на такую ​​​​ситуацию, просто ищите свои идентификаторы в XML, хотя

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

часто встречается в некоторых примерах кода, это должно быть:

 android:id="@android:id/list"
person joecks    schedule 02.08.2013
comment
обычно я даю идентификатор ресурса следующим образом: android:id=@+id/txtViewOne. Итак, как это должно быть отформатировано, чтобы решить эту проблему? Я получаю ошибку компиляции, если я перейду на android:id=android:id/txtViewOne - person jrhamza; 12.09.2013
comment
android:id=@+id/txtViewOne в порядке, вышеприведенный случай - частный случай. Префикс @+id/android:... использовался в предыдущих версиях API и несовместим с robolectric. - person joecks; 13.09.2013
comment
@jrhamza: вам нужно добавить @ вот так: android:id="@android:id/txtViewOne" - person sulai; 25.11.2013
comment
Я не думал, что это решение моей проблемы, но это было так. Чтобы сэкономить время другим, вам ТАКЖЕ нужно сделать это с любым пустым представлением списка, которое может быть в макете, например, @android:id/empty. Так очевидно задним числом, но я даже не думал об этом. - person ajpolt; 03.02.2014

В последней версии Robolectric (3.0-Snapshot) есть некоторые проблемы с настраиваемыми представлениями.

Чтобы это исправить, сделайте следующее:

  1. В приложении модуля, где находится ваш код, создайте файл с именем project.properties на том же уровне, что и AndroidManifest.xml.
  2. Заполните содержимое ссылкой на папку класса сборки. например для StaggeredGridView:

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

person jiahao    schedule 22.03.2015
comment
Однако это не относится к пользовательским представлениям с пользовательскими пространствами имен, которые определены в вашем приложении, не так ли? Я все еще вижу эту проблему. - person Allison; 26.04.2015

В моем случае у меня возникла эта проблема, когда у меня было это в моем приложении:

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

но это в моем проекте unittest:

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

Старая версия библиотеки поддержки, которую я использовал в тестах, не содержала класса, который я пытался использовать (android.support.v4.widget.DrawerLayout).

person koljaTM    schedule 20.01.2014

В моем случае мой FragmentActivity XML раздувал Fragment, который ожидал Bundle. Я заменил XML на держатель FrameLayout и добавил фрагмент с соответствующим пакетом в действие.

person colabug    schedule 10.04.2014