我的android應用程序具有永久的WebSocket連接到服務器。還有一個可以關閉連接的開關。所以現在開關有2種顏色。如果開關打開,則WS已連接並且開關爲綠色。如果開關關閉,則WS斷開並且開關爲紅色。android開關setTrackDrawable導致錯誤的圖像
因此,只有用戶可以通/斷改變開關的狀態。但現在讓我們假設開關已打開,互聯網出現故障。我想向用戶展示該狀態。因此,添加第三狀態 - 黃(這意味着不便是錯誤的)
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:不同顏色的
橢圓:ON是綠色,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));
}
}
所以背後的想法是,當WebSocket的下降來改變背景switch_back_broken.xml
。請注意,此背景在離線模式下具有相同的紅色,唯一不同的是黃色在線顏色。所以這兩個背景涵蓋了所有可能的情況。
我們的問題:
當開關on
我改變TrackDrawable
從switch_back.xml
(這是綠色)switch_back_broken.xml
(即黃色)的UI顯示RED背景(請注意,開關處於狀態ON
),這永遠不會發生。我的背景都不包含ON
開關狀態的紅色。但是,如果我雙擊開關(意思是重新佈局),顏色就會恢復正常。
我想這種行爲是來自交換機的基本狀態,在默認情況下是關閉。所以switch
組件被塗上錯誤的佈局猜測,它應該最初處於off
的狀態。有沒有人遇到過這個問題?
任何建議如何來?任何形式的幫助表示讚賞!
最好的問候,