У меня есть мастер в моем приложении, где пользователи могут возвращаться и переходить между действиями с помощью кнопок "Назад" и "Следующий". Эти кнопки одинаковы для каждого действия в мастере и определяются в их собственном макете xml, который входит в макет для каждого из действий. У них есть список состояний в качестве фона, который обычно работает, за исключением случаев, когда это происходит:
Ожидаемое:
Актуально:
Определение кнопки - 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 файлы, без кубиков. Я все еще в равной степени озадачен.
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);
Слишком много странностей, но мне кажется, что он работает.
Поместите файл "a_dummy_magic.xml" в качестве "самого верхнего" ресурса, который можно извлечь - его можно зафиксировать в нужном месте. Только Android SDK имеет такое необоснованное поведение. Доверьтесь мне. Я испытал это и провел целую неделю, чтобы найти этот трюк.