2017-01-05 10 views
1

У моего приложения Android постоянное соединение с WebSocket с сервером. Существует также переключатель, который обеспечивает возможность отключения этого соединения. Итак, теперь переключатель имеет 2 цвета. Если переключатель включен, WS подключен, а переключатель зеленый. Если переключатель выключен, WS отключается, а переключатель - красный.setTrackDrawable на android Switch в результате неправильного изображения

onlineoffline

Таким образом, только пользователь может изменить состояние переключателя вкл/выкл. Но теперь давайте предположим, что переключатель включен, и Интернет пошел вниз. Я хочу показать пользователю это состояние. Так добавили третье состояние - желтый (что означает, что-л неправильно)

online_but_broken

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. Но если я дважды нажимаю на переключатель (что означает просто ретриверсирующий макет), цвета возвращаются к нормальному.

invalid state

Я предполагаю, что это поведение исходит из основного состояния переключателя, который выключен по умолчанию. Таким образом, компонент switch окрашен неправильной планировкой, предполагая, что он должен быть изначально в состоянии off. Кто-нибудь сталкивался с этой проблемой?

Любые предложения о том, как прийти? Любая помощь приветствуется!

С уважением,

ответ

0

В итоге я получаю уродливое решение. Просто вручную switch перезапуск:

private boolean block = false; 
... 
if (onlineSwitch.isChecked()) { 
    block = true; 
    onlineSwitch.setChecked(false); 
    onlineSwitch.setChecked(true); 
    block = false; 
} 

Примечания block необходимо, если у вас есть onCheckedChanged слушателей, так что вы просто не запускать их:

@Override 
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
    if (block) { 
     return;  
    } 
/// your code 
} 

Интересно, есть ли другой выход. Может быть, что-то вроде requestLayout или ...?

 Смежные вопросы

  • Нет связанных вопросов^_^