2017-01-05 29 views
1

我的android應用程序具有永久的WebSocket連接到服務器。還有一個可以關閉連接的開關。所以現在開關有2種顏色。如果開關打開,則WS已連接並且開關爲綠色。如果開關關閉,則WS斷開並且開關爲紅色。android開關setTrackDrawable導致錯誤的圖像

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:不同顏色的

橢圓: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我改變TrackDrawableswitch_back.xml(這是綠色)switch_back_broken.xml(即黃色)的UI顯示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或...?