Android textAllCaps в теме

У меня есть тема, где нужно, чтобы все текстовые заметки о действиях были капитализированы. Поэтому я устанавливаю textAllCaps в стиле, а затем применяю его к textViewStyle в своей теме, как показано ниже

<style name="Widget.Apex.TextView" parent="android:Widget.TextView">
  <item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
  <item name="android:textAllCaps">true</item>
</style>

<style name="MyTheme" parent="@android:style/Theme.Holo">
  <item name="android:textViewStyle">@style/Widget.Apex.TextView</item>
</style>

К сожалению, это повлияло на то, что мои заголовки приложений, ActionBar и popmenu заглавны. Поэтому я думал, что просто установил атрибуты ActionBarStyle, textAppearanceLargePopupMenu и textAppearanceSmallPopupMenu в своей теме, чтобы иметь собственный стиль с textAllCaps = false. Однако это не работает. Я знаю, что мои темы применяются, потому что, если я устанавливаю textColor или textStyle, они оба применяются к названиям и пунктам меню. Можно ли переопределить textAllCaps в этих стилях?

<style name="Widget.Apex.TextView" parent="android:Widget.TextView">
  <item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
  <item name="android:textAllCaps">true</item>
</style>
<style name="TextAppearance.Apex.Widget.ActionBar.Title" parent="android:TextAppearance.Holo.Widget.ActionBar.Title">
  <item name="android:textAllCaps">false</item>
  <item name="android:textStyle">italic</item>
</style>
<style name="TextAppearance.Apex.Widget.ActionBar.Subtitle" parent="android:TextAppearance.Holo.Widget.ActionBar.Subtitle">
  <item name="android:textAllCaps">false</item>
  <item name="android:textStyle">italic</item>
  <item name="android:textColor">#FF0000</item>
</style>
<style name="TextAppearance.Apex.Widget.PopupMenu.Large" parent="android:TextAppearance.Holo.Widget.PopupMenu.Large">
  <item name="android:textAllCaps">false</item>
  <item name="android:textStyle">italic</item>
  <item name="android:textColor">#FF0000</item>
</style>
<style name="TextAppearance.Apex.Widget.PopupMenu.Small" parent="android:TextAppearance.Holo.Widget.PopupMenu.Small">
  <item name="android:textAllCaps">false</item>
  <item name="android:textStyle">italic</item>
  <item name="android:textColor">#FF0000</item>
</style>
<style name="Widget.Apex.ActionBar" parent="android:Widget.Holo.ActionBar">
  <item name="android:titleTextStyle">@style/TextAppearance.Apex.Widget.ActionBar.Title</item>
  <item name="android:subtitleTextStyle">@style/TextAppearance.Apex.Widget.ActionBar.Subtitle</item>
</style>

<style name="MyTheme" parent="@android:style/Theme.Holo">
  <item name="android:actionBarStyle">@style/Widget.Apex.ActionBar</item>
  <item name="android:textAppearanceLargePopupMenu">@style/TextAppearance.Apex.Widget.PopupMenu.Large</item>
  <item name="android:textAppearanceSmallPopupMenu">@style/TextAppearance.Apex.Widget.PopupMenu.Small</item>
  <item name="android:textViewStyle">@style/Widget.Apex.TextView</item>
</style>

Спасибо, Джонатан

Ответ 1

Используя AppCompat textAllCaps в приложениях Android, поддерживающих более старый API (менее 14)

Работа для этого будет явно задавать стиль следующим образом:

<android.support.v7.internal.widget.CompatTextView
        style="@style/MyTextViewStyle"
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:textAllCaps="true"/>

или альтернативно использовать новый стиль, который наследует textViewStyle и добавляет атрибут textAllCaps вместе с любыми другими стилями по вашему выбору:

  <style name="MyCompatTextViewStyle" parent="MyTextViewStyle">
            <item name="textAllCaps">true</item>
        </style>

В макете:

<android.support.v7.internal.widget.CompatTextView
            style="@style/MyCompatTextViewStyle"
            android:id="@+id/text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

Примечание:

1 > этот виджет не наследует стили по умолчанию, заданные в вашей теме, с помощью android:textViewStyle

2 > Использование этого виджета кажется внутренним, если имя пакета означает, что оно не предназначено для публичного API. Он также не "полностью испечен" в том, что атрибут textAllCaps должен находиться непосредственно в стиле/представлении и не может быть в стиле textAppearance для его работы.

Ответ 2

Попробуйте использовать textAllCaps и android:textAllCaps.

<style name="TextViewStyle">
      <item name="textAllCaps">true</item>
      <item name="android:textAllCaps">true</item>
</style>

Но я думаю, что он работает только с библиотекой дизайна 23.2.0 или новее.