Intereting Posts
Как я могу добавить файлы .so в проект библиотеки андроидов, используя gradle 0.7+ Как я могу заставить webview использовать манифест кэша HTML5? Навигационный ящик – что делает syncState () и почему его следует вызывать внутри onPostCreate ()? Как избежать httpsURLConnection.getInputStream () в Android, зависающем, если указаны неверные учетные данные? Как проверить JUnit IntentService Что случилось с этой строкой формата? Отладка пользовательского вида в редакторе графических макетов ADT Есть ли способ установить Android .img для доступа к содержимому AVD (Android Virtual Device)? Как отключить сканирование для модели в Activeandroid Android: Как настроить Margin / Padding в предпочтении? Как загрузить приложение из Eclipse на Android-телефон вместо AVD Как преобразовать изображение в PDF? Как добавить динамическое представление между элементами RecyclerView в android? Разница между кнопкой с изображением, ImageButton и интерактивным ImageView? Android Nexus One – Могу ли я экономить энергию с помощью цветовой схемы?

Robolectric InflateException при использовании библиотеки поддержки v7 AlertDialog

Использование обычного android.app.AlertDialog работает с ShadowAlertDialog.getLatestAlertDialog() , но если вы используете библиотеку поддержки android.support.v7.app.AlertDialog , то это исключение происходит:

 android.view.InflateException: XML file app/build/intermediates/res/qa/debug/layout/abc_alert_dialog_material.xml line #-1 (sorry, not yet implemented): Error inflating class android.support.v7.internal.widget.DialogTitle at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713) at android.view.LayoutInflater.rInflate(LayoutInflater.java:755) at android.view.LayoutInflater.rInflate(LayoutInflater.java:758) at android.view.LayoutInflater.rInflate(LayoutInflater.java:758) at android.view.LayoutInflater.inflate(LayoutInflater.java:492) at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.inflate(CalligraphyLayoutInflater.java:60) at android.view.LayoutInflater.inflate(LayoutInflater.java:397) at android.view.LayoutInflater.inflate(LayoutInflater.java:353) at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:249) at android.support.v7.app.AppCompatDialog.setContentView(AppCompatDialog.java:75) at android.support.v7.app.AlertController.installContent(AlertController.java:216) at android.support.v7.app.AlertDialog.onCreate(AlertDialog.java:240) at android.app.Dialog.dispatchOnCreate(Dialog.java:361) at android.app.Dialog.show(Dialog.java:262) at org.robolectric.shadows.ShadowDialog.show(ShadowDialog.java:65) at android.app.Dialog.show(Dialog.java) <snip> Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -9 at java.lang.String.substring(String.java:1955) at org.robolectric.res.ResName.qualifyResName(ResName.java:51) at org.robolectric.res.Attribute.getStyleReference(Attribute.java:147) at org.robolectric.res.builder.XmlFileBuilder$XmlResourceParserImpl.getResourceId(XmlFileBuilder.java:789) 

Это известная проблема, но каков наилучший способ ее обхода?
https://github.com/robolectric/robolectric/issues/1736

Solutions Collecting From Web of "Robolectric InflateException при использовании библиотеки поддержки v7 AlertDialog"

Я использую статическую утилиту для создания объектов AlertDialog , и я создаю android.app.AlertDialog когда я обнаруживаю Robolectric в пути к классам. Вот мой код:

 private static Boolean isRobolectricTest = null; /** * Determines if we are running inside of Robolectric or not. */ public static boolean isARobolectricUnitTest() { if (isRobolectricTest == null) { try { Class.forName("org.robolectric.Robolectric"); isRobolectricTest = true; } catch (ClassNotFoundException e) { isRobolectricTest = false; } } return isRobolectricTest; } /** * This utility helps us to workaround a Robolectric issue that causes our unit tests to fail * when an Activity/Fragment creates an AlertDialog using the v7 support library. The * workaround is to use the normal android.app.AlertDialog when running Robolectric tests. * * The Robolectric bug is: https://github.com/robolectric/robolectric/issues/1736 * android.view.InflateException: XML file app/build/intermediates/res/qa/debug/layout/abc_alert_dialog_material.xml line #-1 (sorry, not yet implemented): Error inflating class android.support.v7.internal.widget.DialogTitle */ public static DialogInterface createAndShowDialog(Context context, @StringRes int titleResId, String message, @StringRes int negativeTextResId, DialogInterface.OnClickListener negativeClickListener, @StringRes int neutralTextResId, DialogInterface.OnClickListener neutralClickListener, @StringRes int positiveTextResId, DialogInterface.OnClickListener positiveClickListener, boolean cancelable) { if (isARobolectricUnitTest()) { return UiUtils.createDialog(context, titleResId, message, negativeTextResId, negativeClickListener, neutralTextResId, neutralClickListener, positiveTextResId, positiveClickListener, cancelable); } else { return UiUtils.createDialogSupportV7(context, titleResId, message, negativeTextResId, negativeClickListener, neutralTextResId, neutralClickListener, positiveTextResId, positiveClickListener, cancelable); } } private static android.app.AlertDialog createDialog(Context context, @StringRes int titleResId, String message, @StringRes int negativeTextResId, DialogInterface.OnClickListener negativeClickListener, @StringRes int neutralTextResId, DialogInterface.OnClickListener neutralClickListener, @StringRes int positiveTextResId, DialogInterface.OnClickListener positiveClickListener, boolean cancelable) { android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(context); builder.setTitle(titleResId); builder.setMessage(message); builder.setNegativeButton(negativeTextResId, negativeClickListener); if ((neutralTextResId != -1) && (neutralClickListener != null)) { builder.setNeutralButton(neutralTextResId, neutralClickListener); } builder.setPositiveButton(positiveTextResId, positiveClickListener); builder.setCancelable(cancelable); android.app.AlertDialog alertDialog = builder.create(); alertDialog.show(); return alertDialog; } private static android.support.v7.app.AlertDialog createDialogSupportV7(Context context, @StringRes int titleResId, String message, @StringRes int negativeTextResId, DialogInterface.OnClickListener negativeClickListener, @StringRes int neutralTextResId, DialogInterface.OnClickListener neutralClickListener, @StringRes int positiveTextResId, DialogInterface.OnClickListener positiveClickListener, boolean cancelable) { android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(context); builder.setTitle(titleResId); builder.setMessage(message); builder.setNegativeButton(negativeTextResId, negativeClickListener); if ((neutralTextResId != -1) && (neutralClickListener != null)) { builder.setNeutralButton(neutralTextResId, neutralClickListener); } builder.setPositiveButton(positiveTextResId, positiveClickListener); builder.setCancelable(cancelable); android.support.v7.app.AlertDialog alertDialog = builder.create(); alertDialog.show(); return alertDialog; } 

Это не идеальный вариант, но он выполняет эту работу, и его легко удалить после установки Robolectric.