Кнопка (иногда) не рисует фон StateList xml

1

У меня есть мастер в моем приложении, где пользователи могут возвращаться и переходить между действиями с помощью кнопок "Назад" и "Следующий". Эти кнопки одинаковы для каждого действия в мастере и определяются в их собственном макете xml, который входит в макет для каждого из действий. У них есть список состояний в качестве фона, который обычно работает, за исключением случаев, когда это происходит:

Ожидаемое:

Изображение 174551

Актуально:

Изображение 174551

Определение кнопки - add_nav_buttons.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rlAddNav"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        orientation="horizontal">
        <Button
            android:id="@+id/bAddBack"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true"
            android:background="@drawable/b_add_nav_button"
            android:text="@string/bBack">
        </Button>
        <Button
            android:id="@+id/bAddNext"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:background="@drawable/b_add_nav_button"
            android:text="@string/bNext">
        </Button>
    </LinearLayout>
</RelativeLayout>

Включить пример - some_activity_layout.xml

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rlAddMain"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <!-- OTHER STUFF -->

    <include
        android:id="@+id/NavButtons"
        layout="@layout/add_nav_buttons"
        android:layout_marginTop="-50dp"
        android:layout_alignParentBottom="true">
    </include>
</RelativeLayout> 

Определение StateList - b_add_nav_button.xml

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false">
        <shape>
            <gradient
                android:startColor="#C7C7C7"
                android:endColor="#8B8B8B"
                android:angle="270">
            </gradient>
            <stroke
                android:width="1dp"
                android:color="#8B8B8B"> 
            </stroke>
            <padding
                android:left="10dp"
                android:right="10dp"
                android:top="10dp"
                android:bottom="10dp">
            </padding>
        </shape>
    </item>
    <item android:state_pressed="true" >
        <shape>
            <solid
                android:color="#FFA319" />
            <padding
                android:left="10dp"
                android:right="10dp"
                android:top="10dp"
                android:bottom="10dp" />
        </shape>
    </item>
    <item>
        <shape>
            <gradient
                android:startColor="#4F4FB2"
                android:endColor="#24248F"
                android:angle="270">
            </gradient>
            <stroke
                android:width="1dp"
                android:color="#24248F"> 
            </stroke>
            <padding
                android:left="10dp"
                android:right="10dp"
                android:top="10dp"
                android:bottom="10dp">
            </padding>
        </shape>
    </item>
</selector>

Я полностью озадачен, любая помощь будет высоко оценена. Просто для повторного итерации, в большинстве случаев ожидаемое поведение происходит, только один раз в какое-то время фон не может рисовать.

Я также должен добавить, что кнопки по-прежнему функционируют так, как они должны.

редактировать

Я добавил некоторые отладочные операторы и смог воспроизвести. По-видимому, Android иногда интерпретирует b_add_bav_button.xml как ColorDrawable, а не StateListDrawable. Я попытался вытащить фигуры из списка состояний в свои собственные XML файлы, без кубиков. Я все еще в равной степени озадачен.

  • 0
    Что происходит непосредственно перед тем, как это не удается?
  • 0
    Ничего, сбоев, сообщений об ошибках и т. Д. Нет. Кроме того, он не воспроизводится в эмуляторе и его трудно воспроизвести на реальном телефоне (хотя некоторые телефоны кажутся более склонными к нему, чем другие). Я думаю, что это какая-то проблема, связанная с кэшированием.
Показать ещё 2 комментария
Теги:
button
background

2 ответа

2
Лучший ответ

Android подумал, что я использовал ColorDrawable вместо StateListDrawable, в результате чего было упомянуто выше поведение. Я до сих пор не знаю, почему, но это как-то связано с ориентацией экрана (оно воспроизводимо, начиная деятельность, активность всплывающих окон, вращающийся экран и запуск активности снова).

Моя работа заключалась в том, чтобы вытащить <shape> из селектора xml и вместо этого создать программный код StateListDrawable следующим образом:

StateListDrawable d = new StateListDrawable();
d.addState(new int[]{ android.R.attr.state_pressed, android.R.attr.state_enabled }, 
           this.getResources().getDrawable(R.drawable.b_add_nav_button_pressed));
d.addState(new int[]{ -android.R.attr.state_enabled },
           this.getResources().getDrawable(R.drawable.b_add_nav_button_disabled));
d.addState(new int[]{ android.R.attr.state_enabled },
           this.getResources().getDrawable(R.drawable.b_add_nav_button_normal));
bNext.setBackgroundDrawable(d);

Слишком много странностей, но мне кажется, что он работает.

2

Поместите файл "a_dummy_magic.xml" в качестве "самого верхнего" ресурса, который можно извлечь - его можно зафиксировать в нужном месте. Только Android SDK имеет такое необоснованное поведение. Доверьтесь мне. Я испытал это и провел целую неделю, чтобы найти этот трюк.

  • 0
    Я не знаю, почему это сработало, но это сработало. У меня была одна кнопка (из многих), показывающая это поведение. Я ожидал, что добавление фиктивного файла в лучшем случае просто перенесет проблему на другую кнопку. Тем не менее, кажется, что проблема исчезла. Я считаю, что моя версия сбоя также происходит только в SDK.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню