2017-01-05 14 views
1

私のアンドロイドアプリは、サーバーへの永続WebSocket接続を持っています。また、その接続をオフにする機能を提供するスイッチもあります。今はスイッチに2色あります。スイッチがオンの場合、WSが接続され、スイッチは緑色になります。スイッチがオフの場合、WSは切断され、スイッチは赤色になります。setTrackDrawable on android間違った画像が表示される

onlineoffline

だから、唯一のユーザーはオン/オフスイッチの状態を変更することができます。しかし、スイッチがオンで、インターネットがダウンしたと仮定できます。私はその状態をユーザーに示したい。

<?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:

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

<?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/ toggle_broken.xml toogle_off.xml/:異なる色の

楕円: ON であります緑、オフは赤色で、が壊れていますはオレンジです。

<?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であると私はUIが背景(そのスイッチに気づくがであるREDを表示します(黄色である)switch_back_broken.xmlに(緑)でswitch_back.xmlからTrackDrawableを変更状態ON)、これは決して起こるべきではありません。いずれの背景も、スイッチの状態がONの赤色ではありません。しかし、スイッチをダブルクリックすると(レイアウトを再レイアウトするという意味)、色は正常に戻ります。

invalid state

私は、この動作は、スイッチの基本状態から来て、それはデフォルトではオフだと思います。したがって、switchコンポーネントは、当初状態がoffであるはずの間違ったレイアウトで描画されます。誰もこの問題に直面していますか?

どのように来るべきですか?どんな種類の助けもありがとう!

お礼、

答えて

0

私は醜い解決策で終わります。あなたがonCheckedChangedリスナーを持っている場合

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

blockが必要とされているので、あなたはそれらをトリガしません::ちょうど手動switchを再トリガ

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

私は別の方法があるかどうだろうか。たぶんrequestLayoutのようなものか...?

関連する問題