У моего приложения Android постоянное соединение с WebSocket с сервером. Существует также переключатель, который обеспечивает возможность отключения этого соединения. Итак, теперь переключатель имеет 2 цвета. Если переключатель включен, WS подключен, а переключатель зеленый. Если переключатель выключен, WS отключается, а переключатель - красный.setTrackDrawable на android Switch в результате неправильного изображения
Таким образом, только пользователь может изменить состояние переключателя вкл/выкл. Но теперь давайте предположим, что переключатель включен, и Интернет пошел вниз. Я хочу показать пользователю это состояние. Так добавили третье состояние - желтый (что означает, что-л неправильно)
my_layout.xml
<Switch
android:checked="true"
android:gravity="left"
android:text="Online"
android:thumb="@drawable/switch_thumb"
android:track="@drawable/switch_back"/>
switch_thumb.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid
android:color="@android:color/white"/>
<stroke android:width="4dp" android:color="@android:color/transparent" />
<size
android:width="24dp"
android:height="24dp"/>
</shape>
switch_back. xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/toggle_on" android:state_checked="true" android:state_pressed="true"/>
<item android:drawable="@drawable/toggle_on" android:state_checked="true" android:state_focused="false"/>
<item android:drawable="@drawable/toggle_off" android:state_checked="false" android:state_pressed="true"/>
<item android:drawable="@drawable/toggle_off" android:state_checked="false" android:state_focused="false"/>
</selector>
switch_back_broken.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/toggle_broken" android:state_checked="true" android:state_pressed="true"/>
<item android:drawable="@drawable/toggle_broken" android:state_checked="true" android:state_focused="false"/>
<item android:drawable="@drawable/toggle_off" android:state_checked="false" android:state_pressed="true"/>
<item android:drawable="@drawable/toggle_off" android:state_checked="false" android:state_focused="false"/>
</selector>
toogle_on.xml/toogle_off.xml/toggle_broken.xml:
овалов разных цветов: ПО является зеленый, OFF красный, сломанный оранжевый.
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="@android:color/transparent" />
<corners android:radius="15dp"/>
<solid
android:color="@color/colorCheckGreen"/>
<size
android:width="40dp"
android:height="24dp"/>
</shape>
Вот реализация:
private Switch onlineSwitch;
int currentSwitchBack = R.drawable.switch_back;
@Subscribe
public void wsStatusChange(WsStatusChange event) {
boolean isOnline = WsStatusChange.Status.OPENED.equals(event.getStatus());
int newBackId = isOnline ? R.drawable.switch_back : R.drawable.switch_back_broken;
if (currentSwitchBack != newBackId) {
currentSwitchBack = newBackId;
onlineSwitch.setTrackDrawable(getResources().getDrawable(newBackId));
}
}
Так что идея заключается в изменении фона для switch_back_broken.xml
когда WebSocket идет вниз. Обратите внимание, что этот фон имеет такой же красный цвет для автономного режима, единственное, что отличается от этого, - желтый цвет в Интернете. Таким образом, оба фона охватывают все возможные ситуации.
Теперь к вопросу:
Когда переключатель on
и меняю TrackDrawable
от switch_back.xml
(что зеленый) к switch_back_broken.xml
(который желтый) интерфейс отображает RED фона (обратите внимание, что переключатель находится в состояние ON
), которое НИКОГДА не должно произойти. Ни один из моих фонов не содержит красного цвета для состояния переключателя ON
. Но если я дважды нажимаю на переключатель (что означает просто ретриверсирующий макет), цвета возвращаются к нормальному.
Я предполагаю, что это поведение исходит из основного состояния переключателя, который выключен по умолчанию. Таким образом, компонент switch
окрашен неправильной планировкой, предполагая, что он должен быть изначально в состоянии off
. Кто-нибудь сталкивался с этой проблемой?
Любые предложения о том, как прийти? Любая помощь приветствуется!
С уважением,