Инфлацията на персонализирано оформление с фрагменти в 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);
    }

Редактиране Това е 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.


person joecks    schedule 13.07.2013    source източник
comment
публикуване на locations_list.xml   -  person pskink    schedule 13.07.2013
comment
Добавяне на липсващия файл.   -  person joecks    schedule 13.07.2013
comment
сигурни ли сте, че имате клас com.costum.android.widget .LoadMoreListView? може би има правописна грешка в costum?   -  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