Стиль кнопок работает в Android 5, но не в Android 4

У меня есть стиль кнопки с синим фоном, который отлично работает в API 22, но эта же кнопка отображается темно-серым без примененного стиля в Android 4. Это мой стиль:

<style name="MyApp.Plain" parent="Theme.AppCompat.NoActionBar">
      <item name="android:windowBackground">@drawable/background</item>
      <item name="android:buttonStyle">@style/MyApp.Widget.Button</item>
</style>


  <style name="MyApp.Widget.Button" parent="@android:style/Widget.Button">
      <item name="android:background">@drawable/btn_blue</item>
      <item name="android:focusable">true</item>
      <item name="android:clickable">true</item>
      <item name="android:textStyle">bold</item>
      <item name="android:textSize">14sp</item>
      <item name="android:textColor">#fff</item>
      <item name="android:gravity">center_vertical|center_horizontal</item>
   </style>

Мой btn_blue.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/btn_disabled" android:state_enabled="false"/>
    <item android:drawable="@drawable/btn_pressed" android:state_enabled="true" android:state_pressed="true"/>
    <item android:drawable="@drawable/btn_normal_blue" android:state_enabled="true"/>

</selector>

и btn_normal_blue.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <gradient
        android:angle="90"
        android:endColor="#368ac6"
        android:startColor="#0e58a4" />

    <corners android:radius="20dp" />

</shape>

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

РЕДАКТИРОВАТЬ: Это не работает с поддержкой v7:22.2.0, но работает с v7:21.0.3. Я ничего не изменил, кроме зависимости, и изменил AppCompatActivity на ActionBarActivity.

Возможно, это ошибка Android.

4 ответа

Решение

Пытаться buttonStyle вместо android:buttonStyle, поскольку это атрибут AppCompat pre Lollipop, поэтому он должен быть без префикса Android.

@ Михал Кисель ответ правильный "Попробуйте buttonStyle вместо android:buttonStyle, поскольку это атрибут AppCompat перед Lollipop, поэтому он должен быть без префикса android."Я просто хочу добавить, что если вы, например, создаете представление программно, вы должны также поставить android: buttonStyle и buttonStyle, пример:

    <item name="android:buttonStyle">@style/OrangeButton</item>
    <item name="buttonStyle">@style/OrangeButton</item>

Я видел несколько макетов, где атрибуты применяются дважды, с префиксом Android и без него. Можете ли вы попробовать это:

<style name="MyApp.Widget.Button" parent="@android:style/Widget.Button">
      <item name="android:background">@drawable/btn_blue</item>
      <item name="background">@drawable/btn_blue</item>
      <item name="android:focusable">true</item>
      <item name="android:clickable">true</item>
      <item name="android:textStyle">bold</item>
      <item name="android:textSize">14sp</item>
      <item name="android:textColor">#fff</item>
      <item name="android:gravity">center_vertical|center_horizontal</item>
</style>

В настоящее время я пытаюсь найти, где я видел это ранее, и почему это сработало. Дайте мне знать, если это так.

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

    <style name="MyApp.Widget.Button" parent="Base.TextAppearance.AppCompat.Button">
     <item name="android:background">@drawable/btn_blue</item>
      ...
    </style>
Другие вопросы по тегам