2013-07-13 12 views
7

Podczas pompowania układ we fragmencie, z LayoutInflater, otrzymuję ten wyjątek:niestandardowy układ Inflacja z fragmentami w Robolectric nie działa

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

zorientowali się, że to się dzieje, gdy pompowania niestandardowy układ w

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

Edit to 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> 

wszelkie inne prace układ nadmuchiwania, jak w tym teście:

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

Używam Robolectric z 2,2 Migawki Teraz moje pytanie brzmi jak mogę obejść ten problem i jak mogę wdrożyć brakującą funkcjonalność, Dokumentacja robolektryka jest bardzo skąpa, dlatego miałem problem ze znalezieniem jakiegokolwiek punktu wyjścia.

Pełna Śledzenie stosu

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) 

Ja również wysłana issue na robolectrics śledzenia błędów.

+0

pocztowy locations_list.xml – pskink

+0

Dołącz brakujący plik. – joecks

+0

czy na pewno masz klasę com.costum.android.widget .LoadMoreListView? może jest literówka w "kostiumie"? – pskink

Odpowiedz

5

I zorientowaliśmy się, a jeśli masz czas, aby takiej sytuacji wystarczy spojrzeć na swoich identyfikatorów w XML, chociaż

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

jest często postrzegana w jakiś przykładowy kod musi być:

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

zwykle podaję taki identyfikator zasobu, android: id = "@ + id/txtViewOne". więc jak to sformatować, aby rozwiązać ten problem? Dostaję błąd kompilacji, jeśli zmienię na android: id = "android: id/txtViewOne" – jrhamza

+0

android: id = "@ + id/txtViewOne" jest w porządku, powyższy przypadek jest konkretny. Prefiks @ + id/android: ... był używany w poprzednich wersjach API i nie jest kompatybilny z Robolectric. – joecks

+0

@jrhamza: musisz dodać @ w ten sposób: 'android: id =" @ android: id/txtViewOne "' – sulai

0

w moim przypadku mam ten problem, gdy miałem to w mojej aplikacji:

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

ale w moim projekcie unittest:

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

Im starsza wersja biblioteki wsparcia użyłem w testach nie zawierają klasę starałem się używać (android.support.v4.widget.DrawerLayout).

0

W moim przypadku mój FragmentActivity XML był pompowania Fragment, który oczekiwał Bundle. Zamieniłem kod XML na właściciela FrameLayout i dodałem fragment z odpowiednim pakietem w działaniu.

2

Ostatnia wersja programu Robolectric (3.0-Snapshot) ma pewne problemy z dostosowanymi widokami.

Aby to naprawić, należy wykonać następujące:

  1. W aplikacji modułu gdzie Twój kod, utwórz plik o nazwie project.properties, na tym samym poziomie co AndroidManifest.xml
  2. Napełnić treści z odwołanie do folderu klasy kompilacji. na przykład dla StaggeredGridView:

android.library.reference.1 = ../../budowę/międzywarstwy/eksplodowała-AAR/com.etsy.android.grid/biblioteki/1.0.5

Tutaj należy sprawdzić trzy rzeczy:

  • Powinna być jedna linia na odniesienie
  • Każde odniesienie ma jeden numer (1, 2, 3), które powinny być wzrost o jeden za każdym razem
  • Folder z numerem wersji na końcu musi być zgodny z numerem wersji w pliku build.gradle.

masz przykład projekt roboczy tutaj: https://github.com/jiahaoliuliu/RobolectricSample/blob/master/app/src/main/project.properties

+1

Nie dotyczy to widoków niestandardowych z niestandardowymi przestrzeniami nazw zdefiniowanymi w aplikacji, prawda? Wciąż widzę ten problem. – Allison

Powiązane problemy