2013-07-13 16 views
7

Quando si gonfia un layout in un frammento, con il LayoutInflater, sto ottenendo questa eccezione:layout personalizzato di gonfiaggio con frammenti in Robolectric non funzionante

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

ho capito che questo sta accadendo quando si gonfia un layout personalizzato in

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

Modifica Questa è la 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> 

altre opere di layout gonfiatore, come in questo 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); 
    } 

Sto usando Robolectric con i 2.2-istantanee, Ora la mia domanda è come potrei risolvere questo problema o come avrei potuto implementare la funzionalità mancante, la documentazione robolectric è molto scarsa, quindi ho avuto difficoltà a trovare un punto di partenza.

Stack Trace completa

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) 

ho anche postato la questione issue su robolectrics tracker.

+0

postale locations_list.xml – pskink

+0

Aggiungere il file mancante. – joecks

+0

sei sicuro di avere una classe com.costum.android.widget .LoadMoreListView? forse c'è un refuso in "costum"? – pskink

risposta

5

ho capito, e se hai dello stock da una situazione del genere basta cercare gli ID nel codice XML, anche se

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

è spesso visto in qualche esempio di codice che deve essere:

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

normalmente, fornisco l'identificatore di risorsa come questo, android: id = "@ + id/txtViewOne". quindi, come dovrebbe essere formattato per superare questo problema? Sto ottenendo errore di compilazione, se cambio in android: id = "android: id/txtViewOne" – jrhamza

+0

android: id = "@ + id/txtViewOne" va bene, il caso sopra è un caso specifico. Il prefisso @ + id/android: ... è stato utilizzato nelle precedenti versioni API e non è compatibile con robolectric. – joecks

+0

@jrhamza: è necessario aggiungere @ come questo: 'android: id =" @ android: id/txtViewOne "' – sulai

0

nel mio caso ho avuto questo problema quando ho avuto questo nella mia app:

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

ma questo nel mio progetto unittest:

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

La versione precedente della libreria di supporto che ho usato nelle prove non conteneva la classe stavo cercando di utilizzare (android.support.v4.widget.DrawerLayout).

0

Nel mio caso, il mio XML FragmentActivity gonfiava un Fragment che si aspettava un Bundle. Ho scambiato il XML per un supporto FrameLayout e aggiunto il frammento con il corretto fascio nell'attività.

2

L'ultima versione di Robolectric (3.0-Snapshot) ha alcuni problemi con visualizzazioni personalizzate.

Per rimediare, fare il seguente:

  1. Nell'applicazione modulo in cui il codice è, creare un file chiamato project.properties, allo stesso livello di AndroidManifest.xml
  2. Riempire il contenuto con riferimento alla cartella della classe di build. per esempio. per StaggeredGridView:

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

Qui è necessario controllare tre cose:

  • Ci dovrebbe essere una linea per ogni riferimento
  • Ogni riferimento ha un numero (1, 2, 3), che dovrebbe essere aumento di uno ogni volta
  • La cartella del numero di versione alla fine deve corrispondere con il numero di versione nel file build.gradle.

si ha un esempio di progetto di lavorare qui: https://github.com/jiahaoliuliu/RobolectricSample/blob/master/app/src/main/project.properties

+1

Questo non indirizza le visualizzazioni personalizzate con spazi dei nomi personalizzati che sono definiti all'interno dell'applicazione, però, vero? Vedo ancora quel problema. – Allison

Problemi correlati