Intereting Posts
Есть ли способ узнать, были ли получены трансляции LocalBroadcastManager? Как получить индикатор прогресса в ActionBar в Material Design? Список подключенных устройств Bluetooth? Кнопка переключения нескольких состояний Почему непрерывная камера автоматической фокусировки с обработчиком не позволяет переключать вспышку камеры? Отладка намерений Android http-тестирование с помощью Robolectric Как я могу разместить меню переполнения под панелью инструментов вместо меню переполнения, чтобы перекрывать панель приложений Как подключиться к нескольким базам данных firebase из приложения Android Android GridView с категориями? Совместное использование контента на FaceBook Android OnCreate вызывается в действии A в верхней навигации Zoomch не уменьшает масштаб при переходе на следующую страницу фрагмента Фильтрация пользовательского адаптера IndexOutOfBoundsException Как удалить элемент из RecyclerView с задержкой

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

Solutions Collecting From Web of "Инфляция пользовательского макета с фрагментами в Robolectric не работает"

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

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

Часто рассматривается в некотором примерном коде, который он должен:

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

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

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

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

android.library.reference.1 = .. / .. / строить / промежуточные / разобранном-AAR / com.etsy.android.grid / библиотека / 1.0.5

Здесь вы должны проверить три вещи:

  • Должна быть одна строка для справки
  • Каждая ссылка имеет одно число (1, 2, 3), которое должно увеличиваться на единицу каждый раз
  • Папка номера версии в конце должна совпадать с номером версии в файле build.gradle.

У вас есть пример проекта, который работает здесь: https://github.com/jiahaoliuliu/RobolectricSample/blob/master/app/src/main/project.properties

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

  <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).

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