Использование? Android: attr/в приложениях с обратной совместимостью

Я пытаюсь сделать приложение ICS (API уровня 15) совместимым с Gingerbread (API-уровень 10), и я получаю InflateException Error inflating class <Unknown> для любого XML-макета, который имеет атрибут ?android:attr/. Если я прокомментирую эти атрибуты, я могу скомпилировать и запустить приложение, но тогда это, конечно, выглядит сильным.

Я бы предпочел не дублировать все элементы из android.R.attr, которые я использую, но на данный момент я потерян как другой способ сделать это.

Я использую ActionBarSherlock для работы ActionBar, и, похоже, я не использую ничего, что требует библиотеки поддержки (хотя я включил ее во время процесса выяснения этого), это просто эти тематические ресурсы, на которые я застрял.

Некоторые из тематических ресурсов, которые я использую:

?android:attr/textColorSecondaryInverse ?android:attr/textAppearanceLarge ?android:attr/dividerVertical ?android:attr/selectableItemBackground ?android:attr/textAppearanceMedium ?android:attr/dividerVertical ?android:attr/dividerHorizontal

Ответы

Ответ 1

Как и в документации, некоторые стили находятся в более высоком API. Например:

  • dividerVertical, поскольку API 11
  • dividerHorizontal, так как API 11
Значок

? используется для ссылки на стиль в текущей теме.

Чтобы справиться с вашей проблемой, вы можете:

  • используйте стили из API 11, но поместите их в папку values-v11 и поддерживайте стили для более старых версий в values, используя пользовательские значения или разные атрибуты из более старого API.
  • копировать необходимые стили из ICS
  • не используйте эти стили
  • использовать пользовательские стили

Это зависит от вашей цели. Первое предложение имеет смысл, когда родной стиль приложения важен для вас.
Если вы хотите, чтобы стиль Holo повсюду, тогда нет способа, как скопировать его и использовать как один стиль для всех платформ.
Взгляните на этот проект: https://github.com/Prototik/HoloEverywhere

Ответ 2

использовать стили из API 11 В частности, андроид: attr/textAppearanceMedium? android: attr/dividerVertical? android: attr/dividerHorizontal

Самый простой способ - использовать следующий код, в котором когда-либо были требуемые

<!-- For Horizontal Line-->
<View
android:layout_width="match_parent"
android:layout_height="1dip"
android:layout_marginLeft="4dip"
android:layout_marginRight="4dip"
android:background="#aaa"
android:layout_alignParentTop="true"/>

<!-- For Vertical Line-->

<View
android:id="@+id/VerticalLine"
android:layout_width="1dip"
android:layout_height="wrap_content"
android:layout_marginBottom="4dip"
android:layout_marginTop="4dip"
android:background="#aaa"/>

Ответ 3

Пожалуйста, проверьте поддержку android v7 - проект appcompat. Он имеет много тем и атрибутов для обратной совместимости (attr/dividerHorizontal также)

http://developer.android.com/tools/support-library/features.html#v7-appcompat

Чтобы использовать поддержку v7, вы должны импортировать его в виде проекта Android lib и ссылаться на него из вашего проекта. Он также содержит поддержку v4, поэтому вам может понадобиться удалить поддержку v4 в папке с libs:) Удачи!!